fix(storefront): Stop sending an expired login to the checkout app - #842
Conversation
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>
Resultado do teste no previewPreview: https://ecom2barradoce--pr134-fix-checkout-recover-tv82ga7c.web.app (storefront-app com ecomplus/storefront#1314 + vbeta-app com #842)
Script: Playwright headless, sem criar pedido. Fica em |
Revisão adversarialEscopoA PR deveria: apagar o cookie Premissas verificadas
AchadosNenhum Critical ou Required. Optional
Nit
Eixos sem achado
VereditoAPROVAR COM RESSALVAS. A mudança é correta e mínima. As ressalvas são teste de regressão (item 1) e deixar explícito o acoplamento de rollout com o Não verificado: |
… rejected Update `@ecomplus/storefront-app` to 2.0.0-beta.229, which resets the account step when `GET /customers/:id` fails with a stale token (ecomplus/storefront#1314), the app-side complement of the stale passport cookie cleanup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HYm5krXU4pnuPzynSUMQUg
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HYm5krXU4pnuPzynSUMQUg
leomp12
left a comment
There was a problem hiding this comment.
Mudança bem delimitada. O critério de level === 3 confere: a API do passport do Cloud Commerce só grava níveis 0 a 2 (packages/passport/src/firebase/serve-passport-api.ts), então a identificação legada fica intacta. O fluxo também se encaixa no gate do #785: se a renovação acontece, o watch grava o cookie novo antes de o app.js subir; se não acontece, o app sobe sem identificação em vez de subir com token vencido. Os casos de cookie malformado ou sem auth estão cobertos.
Empurrei dois commits no branch:
3ab14f8a0atualiza o@ecomplus/storefront-apppara2.0.0-beta.229, que tem o ecomplus/storefront#1314. Sem esse bump o complemento do lado do app não chegava às lojas. A 229 ficou alguns dias fora do npm por causa da falha no publish (ecomplus/storefront#1317); conferi que agora está no npm e no jsDelivr/unpkg.04e012fcareduz o comentário doclearStalePassportCookieao motivo do código; a história do bug já está no commit e na descrição do PR.
🟢 Minor: o #812 insere código logo depois do watch(customer), bem perto deste trecho. Quem mergear depois pode precisar de um rebase simples.
Problema
Cliente já cadastrado volta à loja depois que o token do passport expirou. O cookie
ecomPassportClientcontinua com o token vencido (6 dias), oapp.jslegado confia em qualquerauth.id(checkLogin()não valida expiração), fazGET /customers/:id, recebe 401, fazlogout()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 oapp.jsainda não carregou, apaga o cookieecomPassportClientse ele tiverauth.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. Oapp.jssobe sem identificação, mostra a tela de e-mail, e recebe o eventologinviasetSessionassim 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