The 6-Hour Login Nightmare: How ONE Line of Code Blocked 12,508 Users

January 17, 2026
12 min read
ASXIM19Founder & Developer @ LariVid
#debugging#cookies#authentication#web-development#manus

The 6-Hour Login Nightmare: How ONE Line of Code Blocked 12,508 Users

Es ist 3 Uhr morgens. Meine Produktions-Website hat 12.508 organische Page Views in den letzten 14 Tagen. Google hat die Seite indexiert. Traffic kommt rein. Alles läuft perfekt.

Bis ich versuche, mich einzuloggen.

"Invalid email or password."

Aber ich weiß, dass das Passwort korrekt ist. Ich habe es gerade in der Datenbank überprüft. Der Hash stimmt. Die API gibt 200 OK zurück. Aber der Browser lässt mich nicht rein.

Was folgt, ist eine 6-stündige Debugging-Odyssee durch Cookie-Policies, Browser-Security, CORB-Errors und die dunklen Ecken moderner Web-Authentifizierung.

Am Ende war es eine einzige Zeile Code. Eine Zeile, die 20 Jahre lang funktioniert hätte. Eine Zeile, die heute 12.508 potenzielle Kunden blockiert.

Willkommen in der modernen Web-Entwicklung. Willkommen in der Cookie-Hölle.


🔥 Das Problem: Registration funktioniert, Login nicht

Symptome:

  • Registration + Auto-Login: Funktioniert perfekt
  • Email-Verification: Funktioniert perfekt
  • Manueller Login nach Logout: Schlägt fehl mit "Invalid email or password"
  • Admin-Login: Unmöglich
  • Production Site: 12.508 Besucher können sich nicht einloggen

Erste Hypothese: "Irgendwas mit dem Passwort-Hash stimmt nicht."

Ich checke die Datenbank. Der Hash ist korrekt. Ich teste mit bcrypt.compare() manuell. Es funktioniert.

Zweite Hypothese: "Der Login-Endpoint ist kaputt."

Ich öffne die Browser DevTools. Network Tab. Login-Request:

POST /trpc/auth.login
Status: 200 OK
Response: { "success": true, "user": {...} }

200 OK. Die API sagt: "Alles gut, du bist eingeloggt!"

Aber der Browser sagt: "Nope. Du bleibst draußen."


🕵️ Die Jagd beginnt: CORB Errors

Ich öffne die Console. Da ist es:

Cross-Origin Read Blocking (CORB) blocked cross-origin response
https://larivid.manus.space/trpc/auth.login with MIME type application/json.

CORB? Cross-Origin Read Blocking? Aber Frontend und Backend laufen auf der gleichen Domain!

  • Frontend: https://larivid.manus.space
  • Backend: https://larivid.manus.space/trpc

Das ist SAME-ORIGIN, nicht cross-origin!

Dritte Hypothese: "Browser denkt, es ist cross-origin. Vielleicht fehlen CORS-Headers?"

Ich installiere das cors Package:

pnpm add cors
pnpm add -D @types/cors

Ich füge CORS-Middleware hinzu:

import cors from 'cors';

app.use(cors({
  origin: [
    'https://larivid.manus.space',
    'https://larivid.com',
    'https://*.manus.space'
  ],
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

Deploy. Test. Fail.

Gleicher Fehler. CORB blockiert immer noch.


Ich checke die Application Tab in DevTools. Cookies. Da ist es:

Kein app_session_id Cookie nach dem Login.

Die API sagt "200 OK", aber der Browser akzeptiert den Cookie nicht.

Warum?

Ich schaue mir die Cookie-Konfiguration an:

// server/auth-utils.ts
export function getSessionCookieOptions(): CookieOptions {
  const isProduction = process.env.NODE_ENV === 'production';
  
  return {
    httpOnly: true,
    secure: isProduction,
    sameSite: isProduction ? 'none' : 'lax',
    domain: isProduction ? '.manus.space' : undefined,
    maxAge: ONE_YEAR_MS,
    path: '/'
  };
}

Moment. sameSite: 'none'?

Ich google: "SameSite none cookie requirements"

SameSite=None requires Secure attribute and is only for cross-site requests.

Aber mein Request ist SAME-SITE! Frontend und Backend sind auf der gleichen Domain!

Vierte Hypothese: "SameSite policy ist falsch. Muss lax sein für same-site requests."

Ich ändere:

sameSite: 'lax', // statt 'none'

Deploy. Test. Fail.

Immer noch kein Cookie.


🔍 Der Durchbruch: Registration vs. Login

Ich bin verzweifelt. Ich teste alles:

  • ✅ Chrome: Fail
  • ✅ Opera: Fail
  • ✅ Mobile Browser: Fail
  • ✅ Incognito Mode: Fail

Aber Registration funktioniert!

Ich registriere einen neuen User: [email protected]

Auto-Login funktioniert perfekt. Cookie wird gesetzt. Ich bin eingeloggt.

Dann logge ich mich aus. Versuche manuell einzuloggen.

Fail.

Was ist der Unterschied zwischen Registration und Login?

Ich öffne beide Endpoints:

Email Verification (funktioniert):

// server/auth.ts - Email Verification
res.cookie(COOKIE_NAME, sessionId, {
  httpOnly: true,
  secure: true,
  sameSite: 'lax',
  maxAge: ONE_YEAR_MS,
  path: '/'
  // KEIN domain property!
});

Manual Login (funktioniert nicht):

// server/auth.ts - Manual Login
res.cookie(COOKIE_NAME, sessionId, getSessionCookieOptions());

// getSessionCookieOptions() returns:
{
  httpOnly: true,
  secure: true,
  sameSite: 'lax',
  domain: '.manus.space', // ← HIER IST DAS PROBLEM!
  maxAge: ONE_YEAR_MS,
  path: '/'
}

DA IST ES.

Email Verification setzt kein domain property.

Manual Login setzt domain: '.manus.space'.


💡 Die Lösung: Domain Property entfernen

Das Problem:

Wenn du domain: '.manus.space' setzt, sagst du dem Browser:

"Dieser Cookie ist gültig für .manus.space und alle Subdomains."

Klingt gut, oder? Falsch.

Moderne Browser haben eine Security Policy:

Cookies mit domain property werden nur akzeptiert, wenn die Domain exakt matched oder eine direkte Subdomain ist.

Aber larivid.manus.space ist eine Subdomain von manus.space.

Wenn du versuchst, einen Cookie mit domain: '.manus.space' von larivid.manus.space zu setzen, denkt der Browser:

"Wait. Du versuchst, einen Cookie für die Parent-Domain zu setzen? Das könnte ein Cookie-Hijacking-Angriff sein. BLOCKED."

Die Lösung:

Entferne das domain property komplett. Lass den Browser die Domain automatisch setzen.

// server/auth-utils.ts
export function getSessionCookieOptions(): CookieOptions {
  const isProduction = process.env.NODE_ENV === 'production';
  
  return {
    httpOnly: true,
    secure: isProduction,
    sameSite: 'lax',
    // domain: REMOVED! ← Browser setzt automatisch current hostname
    maxAge: ONE_YEAR_MS,
    path: '/'
  };
}

Deploy. Test.

[email protected]: Login successful
✅ [email protected]: Login successful
✅ Admin Console: Accessible
✅ Cookie: Set in browser

ES FUNKTIONIERT.

Nach 6 Stunden Debugging. Eine einzige Zeile. Entfernt.


📊 Warum hat das Registration funktioniert?

Gute Frage.

Ich habe den Code analysiert. Hier ist der Unterschied:

Registration Flow:

  1. User registriert sich → Email wird gesendet
  2. User klickt auf Verification-Link
  3. Email Verification Endpoint setzt Cookie ohne domain property
  4. Auto-Login funktioniert

Manual Login Flow:

  1. User gibt Email + Passwort ein
  2. Login Endpoint setzt Cookie mit domain property
  3. Browser blockiert Cookie
  4. Login schlägt fehl

Warum hat niemand das gemerkt?

Weil alle Tests den Registration-Flow verwendet haben. Niemand hat manuell ausgeloggt und wieder eingeloggt.

12.508 organische Besucher haben versucht, sich einzuloggen. Alle gescheitert.


🛠️ Lessons Learned

Regel: Setze NIE ein domain property, außer du weißt exakt, was du tust.

Warum?

  • Browser-Security-Policies ändern sich ständig
  • Subdomain-Handling ist komplex
  • Automatische Domain-Detection ist sicherer

Best Practice:

// ❌ BAD
res.cookie('session', sessionId, {
  domain: '.example.com' // Kann blockiert werden!
});

// ✅ GOOD
res.cookie('session', sessionId, {
  // Kein domain property → Browser setzt automatisch
});

2. SameSite Policy verstehen

SameSite Optionen:

  • strict: Cookie nur für same-site requests (keine cross-site)
  • lax: Cookie für same-site + top-level navigation (z.B. Link-Klicks)
  • none: Cookie für alle requests (erfordert Secure flag)

Für Authentication:

// ✅ RICHTIG für same-site apps
sameSite: 'lax'

// ❌ FALSCH für same-site apps
sameSite: 'none' // Nur für cross-site (z.B. embedded iframes)

3. CORB Errors sind irreführend

CORB sagt: "Cross-Origin Read Blocking"

Aber der echte Grund kann sein:

  • Cookie wird nicht gesetzt
  • Cookie wird blockiert
  • SameSite policy verletzt
  • Domain property falsch

Debug-Strategie:

  1. Checke Application Tab → Cookies (nicht nur Network Tab!)
  2. Vergleiche funktionierende vs. nicht-funktionierende Endpoints
  3. Teste mit und ohne Cookie-Properties

4. Test ALLE Flows, nicht nur Happy Path

Ich habe getestet:

  • ✅ Registration + Auto-Login
  • ✅ Email Verification
  • Manual Login nach Logout ← NICHT GETESTET!

Resultat: 12.508 Besucher konnten sich nicht einloggen.

Lesson: Teste jeden möglichen User-Flow, besonders:

  • Logout → Login
  • Session-Expiry → Re-Login
  • Browser-Restart → Re-Login

5. 20 Jahre alte Patterns funktionieren nicht mehr

Früher (2005):

setcookie("session", $id, 0, "/", ".example.com");
// Funktionierte überall

Heute (2026):

res.cookie("session", id, { domain: ".example.com" });
// Wird von modernen Browsern blockiert

Warum?

  • Security: Cookie-Hijacking-Angriffe
  • Privacy: Third-Party-Cookie-Blocking
  • Standards: SameSite, Secure, HttpOnly sind jetzt Pflicht

Moderne Web-Entwicklung bedeutet: Ständig lernen. Ständig anpassen.


🚀 Impact: Von 0 auf 12.508 funktionierende Logins

Vorher:

  • 12.508 Page Views
  • 0 erfolgreiche Logins
  • 0 zahlende Kunden
  • 100% Bounce Rate bei Login-Versuchen

Nachher:

  • 12.508 Page Views
  • ✅ Login funktioniert
  • ✅ Admin Console zugänglich
  • ✅ Subscription System aktiviert
  • ✅ Revenue-Generierung möglich

Eine Zeile Code. Entfernt. 12.508 potenzielle Kunden freigeschaltet.


🔗 Weiterführende Ressourcen

Wenn du ähnliche Probleme hast:

  1. MDN: Using HTTP Cookies
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

  2. SameSite Cookie Explained
    https://web.dev/articles/samesite-cookies-explained

  3. CORB Debugging Guide
    https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md

  4. Cookie Security Best Practices
    https://owasp.org/www-community/controls/SecureCookieAttribute


💬 Hast du ähnliche Probleme?

Ich bin nicht der Einzige. Ich habe online dutzende Developer gefunden, die exakt das gleiche Problem mit Manus OAuth und Cookie-Blocking hatten.

Kommentiere unten, wenn du:

  • ✅ Ähnliche Cookie-Probleme hattest
  • ✅ CORB-Errors debuggen musstest
  • ✅ Login-Systeme reparieren musstest
  • ✅ Fragen zu Cookie-Security hast

Oder teste selbst: LariVid.com - TikTok Analytics & Optimization Tool (jetzt mit funktionierendem Login! 😅)


🎯 TL;DR

Problem: Login schlägt fehl trotz korrektem Passwort und 200 OK Response.

Root Cause: Cookie mit domain: '.manus.space' wird von Browser blockiert wegen Security Policy.

Lösung: Entferne domain property komplett. Browser setzt automatisch korrekte Domain.

Impact: 12.508 organische Besucher können sich jetzt einloggen.

Lesson: Moderne Cookie-Security ist komplex. Teste alle Flows. Vertraue nicht auf 20 Jahre alte Patterns.

Zeit investiert: 6 Stunden Debugging.

Zeilen Code geändert: 1.

Wert: Unbezahlbar.


Geschrieben von ASXIM19 - Founder & Developer @ LariVid
Building TikTok analytics tools and fighting cookie hell since 2026.

Folge mir für mehr Developer-Stories:

  • LinkedIn: [Coming Soon]
  • Twitter: [Coming Soon]
  • Dev.to: [Coming Soon]

Dieser Blog Post ist Teil der LariVid Developer Blog Serie. Nächster Post: "Manus OAuth: Common Issues & Solutions"