fix(auth): Anmeldung unter Node 24 (Proxy um NextRequest)
Docker-Images bauen und veroeffentlichen / lint (push) Successful in 1m15s
Docker-Images bauen und veroeffentlichen / typecheck (push) Successful in 1m20s
Docker-Images bauen und veroeffentlichen / test (push) Successful in 1m19s
Docker-Images bauen und veroeffentlichen / build-and-push (push) Failing after 1m14s

Next reicht Route-Handlern einen Proxy um NextRequest. undici 7 (Node 24)
prueft private Felder (#state), die ein Proxy nicht besitzt; new Request(request)
warf "Cannot read private member #state" und jede /api/auth-Anfrage endete
lokal mit 500. Produktion (Node 22, undici 6) war nicht betroffen.

withClientIp baut die Anfrage jetzt aus URL, Methode, Headern und Body neu.
Regressionstest mit einem Proxy wie in Next.
This commit is contained in:
Nick Szaunig committed 2026-10-15 05:10:51 +02:00
1 parent 0421d7d57a
commit 9785eb221f
3 files changed
+37 -9

No files matched your search

+2 -2
View File
@@ -3,9 +3,9 @@ import { getAuth } from "@/lib/auth";
import { withClientIp } from "@/lib/rate-limit";
export async function GET(request: Request) {
return toNextJsHandler(getAuth()).GET(withClientIp(request));
return toNextJsHandler(getAuth()).GET(await withClientIp(request));
}
export async function POST(request: Request) {
return toNextJsHandler(getAuth()).POST(withClientIp(request));
return toNextJsHandler(getAuth()).POST(await withClientIp(request));
}
+11 -3
View File
@@ -147,7 +147,15 @@ export function headersWithClientIp(source: Headers): Headers {
return headers;
}
/** Kopie der Anfrage mit CLIENT_IP_HEADER aus clientIp(); ein mitgeschickter Wert wird ersetzt. */
export function withClientIp(request: Request): Request {
return new Request(request, { headers: headersWithClientIp(request.headers) });
/**
* Kopie der Anfrage mit CLIENT_IP_HEADER aus clientIp(); ein mitgeschickter Wert wird ersetzt.
*
* Bewusst aus URL, Methode und Body neu gebaut statt `new Request(request, …)`:
* Next reicht Route-Handlern einen Proxy um NextRequest, und undici 7 (Node 24)
* prueft private Felder (#state), die ein Proxy nicht hat ("Cannot read private
* member #state"). Unter Node 22 (undici 6, Symbole) fiel das nicht auf.
*/
export async function withClientIp(request: Request): Promise<Request> {
const body = request.method === "GET" || request.method === "HEAD" ? undefined : await request.arrayBuffer();
return new Request(request.url, { method: request.method, headers: headersWithClientIp(request.headers), body, signal: request.signal });
}