Files
IdP/apps/frontend/lib/fedcm-login-bridge.ts
2026-07-07 08:06:55 +03:00

56 lines
1.4 KiB
TypeScript

import { syncFedcmSession } from '@/lib/api';
type FedcmLoginNavigator = Navigator & {
login?: {
setStatus: (status: 'logged-in' | 'logged-out') => void;
};
};
type FedcmIdentityProviderGlobal = {
close?: () => void;
};
declare global {
interface Window {
IdentityProvider?: FedcmIdentityProviderGlobal;
}
}
/** Завершение входа в popup FedCM: cookie + Set-Login для браузера. */
export async function finalizeFedcmLogin(accessToken: string) {
if (typeof window === 'undefined' || !accessToken) {
return;
}
await syncFedcmSession(accessToken);
const loginApi = (navigator as FedcmLoginNavigator).login;
if (loginApi?.setStatus) {
try {
loginApi.setStatus('logged-in');
} catch {
// FedCM API может быть недоступен вне popup-контекста
}
}
if (window.IdentityProvider?.close) {
try {
window.IdentityProvider.close();
} catch {
// закрытие необязательно — браузер сам закроет popup после setStatus
}
}
}
export function shouldFinalizeFedcmLogin(pathname: string) {
return pathname.startsWith('/auth/login');
}
export function isFedcmLoginPopup() {
if (typeof window === 'undefined') return false;
if (window.opener) return true;
if (window.IdentityProvider?.close) return true;
const params = new URLSearchParams(window.location.search);
return params.get('fedcm') === '1';
}