Callback-URL aus APP_URL ableiten

Auth.js baut die redirect_uri nicht aus dem Host-Header, sondern aus AUTH_URL.
Ohne die Variable bleibt sie fest auf http://localhost:3000 — hinter dem
Cloudflare Tunnel wäre die Anmeldung damit kaputt gewesen, und zwar mit einer
Fehlermeldung von Discord, die nicht auf die Ursache zeigt. APP_URL ist ohnehin
die kanonische öffentliche Adresse und wird jetzt durchgereicht.

Nachweis mit dem gebauten Standalone-Server: mit gesetztem APP_URL kommt
https://afis.example.de/api/auth/callback/discord heraus, ohne fällt sie auf
localhost zurück. Ein E2E-Test hält Scope identify, state, PKCE mit S256 und
den Pfad der Callback-URL fest.

Nebenbefund, eigenständig behoben: loadEnvFromRepoRoot hat gesetzte
Umgebungsvariablen mit den Werten der Entwicklungs-.env überschrieben.
process.loadEnvFile tut das von sich aus. Eine .env ist ein Rückfall für die
lokale Entwicklung, kein Vorrang vor dem, was der Aufrufer ausdrücklich
mitgibt — sonst überschreibt sie etwa die APP_URL eines Testlaufs und die
Fehlersuche führt weit weg von der Ursache.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harlekin
2026-09-01 19:37:09 +02:00
co-authored by Claude Opus 5
parent 2e71dfee78
commit 579244ded1
5 changed files with 72 additions and 11 deletions
+3
View File
@@ -15,6 +15,9 @@ DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@pgbouncer:64
DIRECT_DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@db:5432/afis
# --- Anwendung ----------------------------------------------------------------
# Die öffentliche Adresse der Anwendung. Auth.js baut daraus die redirect_uri
# für Discord; sie muss zeichengenau im Developer Portal hinterlegt sein als
# <APP_URL>/api/auth/callback/discord
APP_URL=https://afis.example.de
# 32+ Zeichen. Erzeugen mit: openssl rand -base64 48
AUTH_SECRET=hier-ein-langes-zufaelliges-geheimnis-mit-mindestens-32-zeichen