Skip to content

fix(checkout): return to identification when the session token is rejected - #1314

Open
vitorrgg wants to merge 1 commit into
masterfrom
fix/checkout-recover-from-401
Open

vitorrgg wants to merge 1 commit into
masterfrom
fix/checkout-recover-from-401

Conversation

@vitorrgg

Copy link
Copy Markdown
Member

Problema

Cliente já cadastrado abre /app/#/checkout com o cookie ecomPassportClient guardando um token vencido. checkLogin() só checa auth.id, o LoginBlock emite login na montagem, e EcCheckout.login() já marcava o comprador como identificado (customerEmailisUserIdentified) antes do fetchCustomer. O GET /customers/:id dá 401, o account.js faz logout(), e nada volta o estado: o checkout fica no AccountForm só com o e-mail, como se fosse cliente novo. Relato recorrente da Barradoce/Tia Sônia desde 05/2026, com clientes duplicados nos pedidos.

Os fixes anteriores (#1290 e #1298) atacaram a corrida do token, mas nenhum tratava o resultado do 401.

Mudança

  • EcCheckout.login() só emite login; a identificação passa a acontecer pelo watcher de customer.main_email quando o cadastro é carregado.
  • Checkout.login() chama resetAccount quando o fetch falha e o passport já deslogou, então o LoginBlock continua na tela e captura o evento login quando o token é renovado pelo storefront.

Teste

Reproduzido em produção com Playwright (token vencido + cookie antigo + sem usuário Firebase → 2x 401 e AccountForm). Com esta build servida num preview da Barradoce, o mesmo cenário termina na tela de e-mail. Complementa ecomplus/cloud-commerce (vbeta-app deixa de entregar cookie vencido ao app.js).

🤖 Generated with Claude Code

…ected

`EcCheckout.login()` set `customerEmail` (and so `isUserIdentified`) as soon
as the passport cookie had an `auth.id`, before `fetchCustomer` confirmed the
session. `checkLogin()` does not validate the token, so an expired token led
to 401 on `/customers/:id`, `ecomPassport.logout()`, and a checkout stuck on
the AccountForm with e-mail only, as if the customer were new: returning
customers re-registered and orders created duplicated customers.

Now the buyer is identified only once the account is loaded, via the
`customer.main_email` watcher, and `Checkout.login()` resets the account
state when the fetch fails with the session dropped, so the LoginBlock stays
and picks the `login` event when the token is renewed.

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 #1314 + vbeta-app com ecomplus/cloud-commerce#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