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:
co-authored by
Claude Opus 5
parent
2e71dfee78
commit
579244ded1
+20
-10
@@ -3,21 +3,31 @@ import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
/**
|
||||
* Prisma 7 liest die .env nicht mehr von selbst, und der Seed läuft außerhalb
|
||||
* von Next.js. Im Betrieb kommen die Werte aus dem .env-Reiter von Dockge und
|
||||
* stehen längst in der Umgebung, dann passiert hier nichts.
|
||||
* Node 22 bringt loadEnvFile mit, dafür braucht es kein Paket.
|
||||
* Prisma 7 liest die .env nicht mehr von selbst, und Seed und Tests laufen
|
||||
* ausserhalb von Next.js. Im Betrieb kommen die Werte aus dem .env-Reiter von
|
||||
* Dockge und stehen längst in der Umgebung, dann passiert hier nichts.
|
||||
*
|
||||
* Bereits gesetzte Variablen werden **nicht** überschrieben. `process.loadEnvFile`
|
||||
* tut das von sich aus, und das ist an dieser Stelle falsch: eine .env ist ein
|
||||
* Rückfall für die lokale Entwicklung, kein Vorrang vor dem, was der Aufrufer
|
||||
* ausdrücklich mitgegeben hat. Sonst überschreibt sie zum Beispiel die APP_URL
|
||||
* eines Testlaufs, und die Fehlersuche führt weit weg von der Ursache.
|
||||
*/
|
||||
export function loadEnvFromRepoRoot(): void {
|
||||
const here = path.dirname(fileURLToPath(import.meta.url))
|
||||
for (const candidate of [
|
||||
const candidates = [
|
||||
path.resolve(here, '../../../.env'),
|
||||
path.resolve(here, '../../.env'),
|
||||
path.resolve(process.cwd(), '.env'),
|
||||
]) {
|
||||
if (existsSync(candidate)) {
|
||||
process.loadEnvFile(candidate)
|
||||
return
|
||||
}
|
||||
]
|
||||
|
||||
const file = candidates.find((candidate) => existsSync(candidate))
|
||||
if (!file) return
|
||||
|
||||
const before = new Map(Object.entries(process.env))
|
||||
process.loadEnvFile(file)
|
||||
|
||||
for (const [key, value] of before) {
|
||||
if (value !== undefined) process.env[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user