Skip to content

fix(storefront): Stop sending an expired login to the checkout app - #842

Open
vitorrgg wants to merge 1 commit into
mainfrom
fix/vbeta-app-stale-passport-cookie
Open

vitorrgg wants to merge 1 commit into
mainfrom
fix/vbeta-app-stale-passport-cookie

Conversation

@vitorrgg

Copy link
Copy Markdown
Member

Problema

Cliente já cadastrado volta à loja depois que o token do passport expirou. O cookie ecomPassportClient continua com o token vencido (6 dias), o app.js legado confia em qualquer auth.id (checkLogin() não valida expiração), faz GET /customers/:id, recebe 401, faz logout() e o checkout fica no formulário "Complete seu cadastro" como cliente novo. Relato recorrente da Barradoce desde 05/2026, ainda reproduzido em 15/09 após o #785 e o beta.228.

Reproduzido em produção com Playwright: token vencido no ecomSession + cookie antigo + sem usuário Firebase → nenhum POST em /_api/passport/token, 2x 401 e AccountForm. Quando a renovação do #785 não acontece (sem usuário Firebase o app carrega na hora; falha ou cold start > 10s em /_api/passport/token), o resultado é sempre esse.

Mudança

No watch(isAuthenticated) do vbeta-app, quando a sessão não está autenticada e o app.js ainda não carregou, apaga o cookie ecomPassportClient se ele tiver auth.level === 3 (só o Cloud Commerce grava esse nível). Identificações legadas por e-mail + documento (nível 0 a 2) não são tocadas. O app.js sobe sem identificação, mostra a tela de e-mail, e recebe o evento login via setSession assim que o token é renovado.

Complementa ecomplus/storefront (fix/checkout-recover-from-401), que faz o checkout voltar à identificação quando o fetch do cliente falha.

Teste

Preview na Barradoce com este vbeta-app (override local) + build do storefront-app com o fix. Mesmo cenário do Playwright termina na tela de e-mail, sem 401.

🤖 Generated with Claude Code

Returning customers whose stored token had expired were dropped on the
"complete your registration" form as if they were new, and orders created
duplicated customers. The legacy app.js trusts any `auth.id` on the
`ecomPassportClient` cookie (no expiry check), requests `/customers/:id`
with the dead token, gets 401 and logs out without leaving the form.

vbeta-app now drops that cookie when the Cloud Commerce session is not
authenticated and the cookie was written by it (level 3), keeping legacy
e-mail + document identifications untouched. app.js then starts
unidentified and receives the `login` event when the token is renewed,
either before it loads (#785 wait) or later through `setSession`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@vitorrgg

Copy link
Copy Markdown
Member Author

Resultado do teste no preview

Preview: https://ecom2barradoce--pr134-fix-checkout-recover-tv82ga7c.web.app (storefront-app com ecomplus/storefront#1314 + vbeta-app com #842)

Cenário Produção (beta.228 + 2.63.2) Preview
Sem sessão (controle) tela de e-mail tela de e-mail
Token vencido + cookie ecomPassportClient nível 3 + sem usuário Firebase 2x 401 em /customers/:id"Complete seu cadastro" nenhum 401, cookie apagado antes do app.js → tela de e-mail
Cookie legado nível 2 com token inválido (isola o fix do storefront-app) 2x 401 → "Complete seu cadastro" 2x 401 → resetAccounttela de e-mail
Token inválido com expires no futuro 2x 401 → redirect para a home 2x 401 → redirect para a home (fora do escopo, listener de logout do vbeta-app)

Script: Playwright headless, sem criar pedido. Fica em cloud-commerce/temp/checkout-login-bug-test.mjs na máquina do Vitor (ORIGIN=<url> TAG=<tag> node checkout-login-bug-test.mjs).

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