diff --git a/server/utils/cookies.js b/server/utils/cookies.js index c4c9bf6..ae8b474 100644 --- a/server/utils/cookies.js +++ b/server/utils/cookies.js @@ -11,17 +11,33 @@ export function getCookieSecureDefault() { } export function getSameSiteDefault() { - // Erwartung aus Security-Feedback: Strict. In Dev ggf. Lax, damit SSO/Flows nicht nerven. + // Cookie SameSite-Konfiguration + // - 'none': Erlaubt Cookies in Cross-Site-iframes (erfordert Secure: true) + // - 'lax': Erlaubt Cookies bei Navigation (Standard für Cross-Site) + // - 'strict': Blockiert alle Cross-Site-Cookies (sicherste Option, blockiert iframes) const v = (process.env.COOKIE_SAMESITE || '').toLowerCase().trim() if (v === 'strict' || v === 'lax' || v === 'none') return v - return isProduction() ? 'strict' : 'lax' + + // Default: 'none' für Cross-Site-iframes (wenn in iframe eingebettet) + // WICHTIG: SameSite: none erfordert Secure: true (HTTPS) + // Falls iframe-Einbettung nicht benötigt wird, kann auf 'strict' oder 'lax' geändert werden + return 'none' // Ermöglicht Einbettung in iframes (z.B. von harheimertc.de) } export function getAuthCookieOptions() { + const sameSite = getSameSiteDefault() + const secure = getCookieSecureDefault() + + // SameSite: none erfordert Secure: true + // Wenn SameSite: none gesetzt ist, aber Secure: false, warnen + if (sameSite === 'none' && !secure) { + console.warn('⚠️ SameSite: none erfordert Secure: true. Cookie könnte in iframes nicht funktionieren.') + } + return { httpOnly: true, - secure: getCookieSecureDefault(), - sameSite: getSameSiteDefault(), + secure: secure, + sameSite: sameSite, maxAge: 60 * 60 * 24 * 7 // 7 days } }