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.
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { defineConfig, devices } from '@playwright/test'
|
|
|
|
const PORT = Number(process.env.E2E_PORT ?? 3100)
|
|
const baseURL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}`
|
|
|
|
export default defineConfig({
|
|
testDir: './e2e',
|
|
fullyParallel: true,
|
|
forbidOnly: !!process.env.CI,
|
|
retries: process.env.CI ? 1 : 0,
|
|
reporter: process.env.CI ? [['github'], ['html', { open: 'never' }]] : 'list',
|
|
use: {
|
|
baseURL,
|
|
locale: 'de-DE',
|
|
timezoneId: 'Europe/Berlin',
|
|
trace: 'on-first-retry',
|
|
},
|
|
projects: [
|
|
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
{ name: 'mobil', use: { ...devices['Pixel 7'] } },
|
|
],
|
|
webServer: process.env.E2E_BASE_URL
|
|
? undefined
|
|
: {
|
|
// Derselbe Standalone-Server, den auch das Container-Image startet.
|
|
command: `pnpm build && node .next/standalone/web/server.js`,
|
|
url: `${baseURL}/api/health`,
|
|
reuseExistingServer: !process.env.CI,
|
|
timeout: 180_000,
|
|
// APP_URL muss der Testserver kennen: Auth.js baut daraus die
|
|
// redirect_uri, und die wird geprüft. Ohne sie fiele sie auf den
|
|
// Request-Origin zurück und die Zusicherung wäre wertlos.
|
|
env: { PORT: String(PORT), HOSTNAME: '127.0.0.1', APP_URL: baseURL },
|
|
},
|
|
})
|