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 ===
|
// === Auth flow ===
|
||||||
export async function signIn(): Promise<void> {
|
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 state = generateRandomString(32);
|
||||||
const nonce = generateRandomString(32);
|
const nonce = generateRandomString(32);
|
||||||
const pkce = await generatePkce();
|
const pkce = await generatePkce();
|
||||||
@@ -142,7 +151,16 @@ export async function handleCallback(): Promise<boolean> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!res.ok) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user