Skip to content

fix(Auth): Revalidar token expirado antes de derrubar a sessão - #97

Open
risixdzn wants to merge 2 commits into
developfrom
rick/fix/jwt-revalidate-crash-49
Open

risixdzn wants to merge 2 commits into
developfrom
rick/fix/jwt-revalidate-crash-49

Conversation

@risixdzn

Copy link
Copy Markdown
Member

Resumo

  • Corrige o crash intermitente relatado na FIXR-49: getSession (apps/web/lib/auth/utils.ts) chamava userJWT.parse sem tratamento, então um cookie de sessão ausente/expirado lançava um ZodError não tratado e derrubava a página.
  • Causa raiz: o middleware (apps/web/middleware.ts) já revalidava o JWT via /auth/token quando expirado, mas só anexava o cookie renovado na resposta — nunca repassava para a request atual. Por isso, o Server Component (layout.tsx) ainda lia o cookie antigo/expirado na mesma passagem e quebrava.
  • Agora o middleware aplica os cookies renovados também na request corrente antes de seguir (NextResponse.next({ request })), garantindo que a sessão revalidada seja usada na mesma renderização em vez de crashar.
  • getSession agora usa safeParse e retorna null em vez de lançar, igual ao padrão já usado em getClientSession.
  • O layout do dashboard (apps/web/app/(protected)/dashboard/[subdomain]/layout.tsx) redireciona para /auth/login apenas se a revalidação realmente falhar (sessão nula após a tentativa do middleware).
  • Bônus: resolvido um conflito de merge não finalizado (<<<<<<< HEAD / >>>>>>>) já commitado em apps/server/src/modules/account/repositories/index.ts, migrando updateAvatarUrl para o InvalidateCache (infra de cache atual), já que os helpers antigos de core/lib/cache não existem mais.

Plano de teste

  • tsc --noEmit (web e server)
  • biome check nos arquivos alterados
  • Validar manualmente: acessar rota protegida com cookie de sessão expirado e cookie de refresh válido — sessão deve ser revalidada sem crash
  • Validar manualmente: acessar rota protegida sem refresh token válido — deve redirecionar para /auth/login

Fixes FIXR-49

🤖 Generated with Claude Code

risixdzn and others added 2 commits September 18, 2026 12:15
getSession() threw an unhandled ZodError when the session cookie was
missing/expired, because the middleware refreshed the JWT but never
forwarded the new cookie to the current request, so downstream Server
Components still parsed the stale one.

Forward the revalidated cookies into the request in middleware, make
getSession() fail gracefully to null instead of throwing, and redirect
to login in the dashboard layout only if revalidation truly failed.

Fixes FIXR-49

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
apps/server/src/modules/account/repositories/index.ts had unresolved
<<<<<<< HEAD / ======= / >>>>>>> markers left over from an earlier
merge, silently committed to develop. Resolved onto the Cached/
InvalidateCache infra (the current caching approach used by every
other repository), migrating updateAvatarUrl off the now-deleted
core/lib/cache helpers.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@linear-code

linear-code Bot commented Sep 18, 2026

Copy link
Copy Markdown

FIXR-49

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant