fix(auth): limpar PKCE state no signIn e tratar invalid_grant

- signIn agora limpa logto_state/nonce/verifier antes de começar
- Evita mismatch quando user tenta logar de novo no mesmo browser
- handleCallback limpa estado se /oidc/token retorna 400 invalid_grant
- Resolve loop 'Falha no login' em modo anônimo re-login
This commit is contained in:
2026-08-18 10:43:36 +00:00
parent 88e467c02b
commit 59ee8f56a8
+19 -1
View File
@@ -85,6 +85,15 @@ async function generatePkce(): Promise<{ verifier: string; challenge: string }>
// === Auth flow ===
export async function signIn(): Promise<void> {
// Limpa estado anterior pra evitar PKCE mismatch
try {
sessionStorage.removeItem('logto_state');
sessionStorage.removeItem('logto_nonce');
sessionStorage.removeItem('logto_verifier');
} catch {
/* ignore */
}
const state = generateRandomString(32);
const nonce = generateRandomString(32);
const pkce = await generatePkce();
@@ -142,7 +151,16 @@ export async function handleCallback(): Promise<boolean> {
});
if (!res.ok) {
console.error('Token exchange failed:', await res.text());
const errorText = await res.text();
console.error('Token exchange failed:', errorText);
// Limpa código da URL pra evitar retry com code inválido
try {
sessionStorage.removeItem('logto_state');
sessionStorage.removeItem('logto_nonce');
sessionStorage.removeItem('logto_verifier');
} catch {
/* ignore */
}
return false;
}