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:
+19
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user