Fix post-login redirect when the session cookie is off-origin #30

Merged
Michilis merged 1 commits from dev into main 2026-07-29 20:46:12 +00:00
Owner

Signing in showed the "Welcome back!" toast but never left /login. The
session cookie was host-only on the API subdomain, so the Next middleware
guard on the site origin saw no cookie and bounced /dashboard straight
back to /login?redirect=/dashboard.

  • Add AUTH_COOKIE_DOMAIN, wiring Better Auth's crossSubDomainCookies so
    the cookie also reaches the site origin. Unset in dev, where localhost
    is single-host and must stay host-only.
  • Navigate after authentication with a full page load, via a shared
    authRedirect helper: only a top-level request carries the httpOnly
    cookie. Used by the login, register, magic-link and Google flows.
  • Show "Redirecting..." on the login and register pages and keep the
    submit button disabled until the browser replaces the page, instead of
    re-enabling it mid-navigation.
  • Guard against a redirect loop with a sessionStorage marker. A React ref
    cannot do this: the full page load resets component state. If the
    destination bounces back, explain it rather than navigating again.
  • Middleware: accept any *.session_token cookie so a cookiePrefix change
    cannot lock everyone out, and preserve the destination's query string.
  • Trust any loopback port in dev, so reaching the dev server through a
    forwarded port does not fail Better Auth's CSRF origin check.
Signing in showed the "Welcome back!" toast but never left /login. The session cookie was host-only on the API subdomain, so the Next middleware guard on the site origin saw no cookie and bounced /dashboard straight back to /login?redirect=/dashboard. - Add AUTH_COOKIE_DOMAIN, wiring Better Auth's crossSubDomainCookies so the cookie also reaches the site origin. Unset in dev, where localhost is single-host and must stay host-only. - Navigate after authentication with a full page load, via a shared authRedirect helper: only a top-level request carries the httpOnly cookie. Used by the login, register, magic-link and Google flows. - Show "Redirecting..." on the login and register pages and keep the submit button disabled until the browser replaces the page, instead of re-enabling it mid-navigation. - Guard against a redirect loop with a sessionStorage marker. A React ref cannot do this: the full page load resets component state. If the destination bounces back, explain it rather than navigating again. - Middleware: accept any *.session_token cookie so a cookiePrefix change cannot lock everyone out, and preserve the destination's query string. - Trust any loopback port in dev, so reaching the dev server through a forwarded port does not fail Better Auth's CSRF origin check.
Michilis added 1 commit 2026-07-29 20:46:04 +00:00
Signing in showed the "Welcome back!" toast but never left /login. The
session cookie was host-only on the API subdomain, so the Next middleware
guard on the site origin saw no cookie and bounced /dashboard straight
back to /login?redirect=/dashboard.

- Add AUTH_COOKIE_DOMAIN, wiring Better Auth's crossSubDomainCookies so
  the cookie also reaches the site origin. Unset in dev, where localhost
  is single-host and must stay host-only.
- Navigate after authentication with a full page load, via a shared
  authRedirect helper: only a top-level request carries the httpOnly
  cookie. Used by the login, register, magic-link and Google flows.
- Show "Redirecting..." on the login and register pages and keep the
  submit button disabled until the browser replaces the page, instead of
  re-enabling it mid-navigation.
- Guard against a redirect loop with a sessionStorage marker. A React ref
  cannot do this: the full page load resets component state. If the
  destination bounces back, explain it rather than navigating again.
- Middleware: accept any *.session_token cookie so a cookiePrefix change
  cannot lock everyone out, and preserve the destination's query string.
- Trust any loopback port in dev, so reaching the dev server through a
  forwarded port does not fail Better Auth's CSRF origin check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Michilis merged commit 82857b5aa8 into main 2026-07-29 20:46:12 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Michilis/Spanglish#30