export interface OneTapUrls {
apiBase: string;
frontendBase: string;
widgetUrl: string;
fedcmConfigUrl: string;
webIdentityUrl: string;
fedcmDiscoverUrl: string;
projectName: string;
}
export interface OneTapExample {
id: string;
label: string;
language: string;
code: string;
}
export function buildOneTapUrls(
apiBase: string,
frontendBase: string,
projectName = 'MVK ID'
): OneTapUrls {
const base = apiBase.replace(/\/+$/, '');
const front = frontendBase.replace(/\/+$/, '');
let webIdentityOrigin = front;
try {
webIdentityOrigin = new URL(base).origin;
} catch {
// keep frontend origin
}
return {
apiBase: base,
frontendBase: front,
widgetUrl: `${front}/sso-widget.js`,
fedcmConfigUrl: `${base}/fedcm/config.json`,
fedcmDiscoverUrl: `${base}/fedcm/discover.json`,
webIdentityUrl: `${webIdentityOrigin}/.well-known/web-identity`,
projectName
};
}
export function buildOneTapExamples(urls: OneTapUrls, clientId: string, redirectUri?: string): OneTapExample[] {
const { apiBase, frontendBase, widgetUrl, fedcmConfigUrl, webIdentityUrl, projectName } = urls;
const callbackUri = redirectUri?.trim() || 'https://app.example.com/auth/callback';
return [
{
id: 'widget-script',
label: 'Виджет (script)',
language: 'html',
code: `
`
},
{
id: 'sdk-manual',
label: 'SDK вручную',
language: 'javascript',
code: `
`
},
{
id: 'fedcm-native',
label: 'FedCM API',
language: 'javascript',
code: `const credential = await navigator.credentials.get({
identity: {
providers: [{
configURL: '${fedcmConfigUrl}',
clientId: '${clientId}'
}]
},
mediation: 'optional'
});
const idToken = credential?.token; // JWT — проверьте на backend`
},
{
id: 'postmessage',
label: 'Popup postMessage',
language: 'javascript',
code: `window.addEventListener('message', (event) => {
if (event.origin !== '${frontendBase}') return;
if (event.data?.type !== 'lendry-sso-onetap') return;
const { code, idToken, token, error } = event.data;
if (error) return console.error(error);
// code — обменяйте на POST ${apiBase}/oauth/token
// idToken / token — проверьте JWT (issuer = ${apiBase})
});`
},
{
id: 'curl-fedcm',
label: 'Диагностика (curl)',
language: 'bash',
code: `curl -sH "Sec-Fetch-Dest: webidentity" ${webIdentityUrl}
curl -sH "Sec-Fetch-Dest: webidentity" ${fedcmConfigUrl}
curl -s ${apiBase}/fedcm/discover.json`
}
];
}