fix(auth): dedup logto token exchange with Promise caching

This commit is contained in:
2026-08-18 11:05:59 +00:00
parent 08b782a488
commit 50d563c0fd
+14 -1
View File
@@ -120,8 +120,13 @@ export async function signIn(): Promise<void> {
window.location.assign(LOGTO_ENDPOINT + '/oidc/auth?' + params.toString()); window.location.assign(LOGTO_ENDPOINT + '/oidc/auth?' + params.toString());
} }
let callbackPromise: Promise<boolean> | null = null;
export async function handleCallback(): Promise<boolean> { export async function handleCallback(): Promise<boolean> {
try { if (callbackPromise) return callbackPromise;
callbackPromise = (async () => {
try {
const url = new URL(window.location.href); const url = new URL(window.location.href);
const code = url.searchParams.get('code'); const code = url.searchParams.get('code');
const state = url.searchParams.get('state'); const state = url.searchParams.get('state');
@@ -184,7 +189,15 @@ export async function handleCallback(): Promise<boolean> {
} catch (err) { } catch (err) {
console.error('Callback error:', err); console.error('Callback error:', err);
return false; return false;
} finally {
// Limpa a promise depois de um tempo pra permitir novos logins futuros,
// mas bloqueia execuções duplas imediatas (React Strict Mode / uso duplo)
setTimeout(() => {
callbackPromise = null;
}, 2000);
} }
})();
return callbackPromise;
} }
export async function getUser(): Promise<LogtoUser | null> { export async function getUser(): Promise<LogtoUser | null> {