fix and update
This commit is contained in:
@@ -5,6 +5,7 @@ export type DocBlock =
|
||||
| { type: 'callout'; variant: 'info' | 'warning' | 'tip'; title: string; text: string }
|
||||
| { type: 'table'; headers: string[]; rows: string[][] }
|
||||
| { type: 'oauth-examples' }
|
||||
| { type: 'one-tap-examples' }
|
||||
| { type: 'auth-login-examples' }
|
||||
| { type: 'auth-ldap-examples' }
|
||||
| { type: 'bot-examples' }
|
||||
@@ -956,6 +957,23 @@ $oidc->authenticate(); // client_id, redirect_uri, response_type=code — авт
|
||||
title: 'Примеры интеграции',
|
||||
blocks: [{ type: 'oauth-examples' }]
|
||||
},
|
||||
{
|
||||
id: 'one-tap',
|
||||
title: 'One Tap Login',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'Для входа в один клик на сторонних сайтах (FedCM + виджет sso-widget.js) см. отдельный раздел документации.'
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
items: [
|
||||
'One Tap Login — FedCM endpoints, подключение sso-widget.js, popup fallback',
|
||||
'Требуется зарегистрированный OAuth client_id и redirect_uri вашего сайта'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'scopes',
|
||||
title: 'Scopes',
|
||||
@@ -974,6 +992,201 @@ $oidc->authenticate(); // client_id, redirect_uri, response_type=code — авт
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
slug: 'one-tap-login',
|
||||
title: 'One Tap Login',
|
||||
description: 'Вход в один клик для сайтов-клиентов: FedCM (основной) и JS SDK с popup (fallback).',
|
||||
sections: [
|
||||
{
|
||||
id: 'overview',
|
||||
title: 'Обзор',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'One Tap Login позволяет пользователям вашего сайта войти через Lendry ID без полного редиректа на страницу авторизации. Поддерживаются два режима: Federated Credential Management (FedCM) в современных браузерах и виджет sso-widget.js с popup-окном для остальных.'
|
||||
},
|
||||
{
|
||||
type: 'callout',
|
||||
variant: 'info',
|
||||
title: 'Предварительные требования',
|
||||
text: 'Создайте OAuth-приложение в админ-панели (RBAC → OAuth приложения): укажите redirect_uri вашего сайта, scopes openid profile email и сохраните client_id. Подробнее — раздел «OAuth 2.0 / OIDC».'
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
items: [
|
||||
'FedCM — браузер показывает нативный диалог «Войти как …», если пользователь уже залогинен на домене IdP',
|
||||
'Fallback — скрипт sso-widget.js рисует плашку «Войти через …» в правом верхнем углу и открывает popup с OAuth',
|
||||
'Оба режима возвращают OIDC id_token (FedCM) или authorization code / токены (popup) — проверяйте на backend'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'fedcm-endpoints',
|
||||
title: 'FedCM endpoints',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'Endpoints размещены на PUBLIC_API_URL (issuer). Локально: http://localhost:3000. При same-origin деплое: https://ваш-домен/idp-api. CORS настроен с credentials: true для запросов с сайтов-клиентов.'
|
||||
},
|
||||
{
|
||||
type: 'table',
|
||||
headers: ['Endpoint', 'Метод', 'Описание'],
|
||||
rows: [
|
||||
['{PUBLIC_API_URL}/.well-known/web-identity', 'GET', 'Манифест FedCM → provider_urls'],
|
||||
['{PUBLIC_API_URL}/fedcm/config.json', 'GET', 'Конфигурация IdP (accounts, id_assertion, branding)'],
|
||||
['{PUBLIC_API_URL}/fedcm/accounts', 'GET', 'Список аккаунтов по cookie lendry_fedcm_sess'],
|
||||
['{PUBLIC_API_URL}/fedcm/id_assertion', 'POST', 'Выдача id_token для client_id + account_id'],
|
||||
['{PUBLIC_API_URL}/fedcm/client_metadata', 'GET', '?client_id=… — privacy/terms для UI FedCM'],
|
||||
['{PUBLIC_API_URL}/fedcm/session/sync', 'POST', 'Установить FedCM cookie по Bearer access token']
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'callout',
|
||||
variant: 'warning',
|
||||
title: 'FedCM cookie',
|
||||
text: 'FedCM использует HttpOnly cookie lendry_fedcm_sess на домене IdP (SameSite=None; Secure в production). Cookie устанавливается при входе на IdP или через POST /fedcm/session/sync. localStorage JWT с сайта клиента для FedCM не подходит.'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'widget',
|
||||
title: 'Подключение виджета (sso-widget.js)',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'Скрипт размещён на frontend IdP по адресу {PUBLIC_FRONTEND_URL}/sso-widget.js. Достаточно одного тега script — инициализация выполняется автоматически при загрузке страницы.'
|
||||
},
|
||||
{
|
||||
type: 'table',
|
||||
headers: ['Атрибут data-*', 'Обязательный', 'Описание'],
|
||||
rows: [
|
||||
['data-client-id', 'Да', 'client_id OAuth-приложения из админки'],
|
||||
['data-idp-url', 'Нет', 'PUBLIC_API_URL; по умолчанию origin скрипта + /idp-api'],
|
||||
['data-idp-frontend-url', 'Нет', 'URL frontend IdP для popup; по умолчанию origin скрипта'],
|
||||
['data-provider-name', 'Нет', 'Название в плашке (по умолчанию MVK ID)'],
|
||||
['data-redirect-uri', 'Нет', 'redirect_uri OAuth; по умолчанию origin + /auth/callback'],
|
||||
['data-scope', 'Нет', 'Scopes OAuth (по умолчанию openid profile email)'],
|
||||
['data-on-success', 'Нет', 'Имя глобальной функции-callback'],
|
||||
['data-auto-init', 'Нет', 'false — отключить автозапуск; вызовите LendryIdOneTap.init()']
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'callout',
|
||||
variant: 'tip',
|
||||
title: 'Логика выбора режима',
|
||||
text: 'Если браузер поддерживает IdentityCredential — скрипт вызывает FedCM. Если нет — показывается плашка в правом верхнем углу; по клику открывается popup OAuth (параметр display=popup).'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'fedcm-integration',
|
||||
title: 'Интеграция FedCM вручную',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'Если вы не используете sso-widget.js, можно вызвать FedCM API напрямую. configURL должен указывать на /fedcm/config.json провайдера.'
|
||||
},
|
||||
{
|
||||
type: 'code',
|
||||
language: 'javascript',
|
||||
title: 'Минимальный пример',
|
||||
code: `const credential = await navigator.credentials.get({
|
||||
identity: {
|
||||
providers: [{
|
||||
configURL: 'https://id.lendry.ru/idp-api/fedcm/config.json',
|
||||
clientId: 'YOUR_CLIENT_ID'
|
||||
}]
|
||||
},
|
||||
mediation: 'optional'
|
||||
});
|
||||
|
||||
const idToken = credential?.token;
|
||||
// Передайте idToken на ваш backend для проверки`
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
items: [
|
||||
'mediation: "optional" — показать диалог только при наличии сессии IdP',
|
||||
'mediation: "required" — всегда показывать UI выбора аккаунта',
|
||||
'mediation: "silent" — без UI; вернёт ошибку, если пользователь не залогинен'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'popup-fallback',
|
||||
title: 'Popup fallback и postMessage',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'При клике на виджет открывается popup с OAuth authorize. После успешного входа IdP отправляет результат родительскому окну через window.postMessage с типом lendry-sso-onetap.'
|
||||
},
|
||||
{
|
||||
type: 'code',
|
||||
language: 'javascript',
|
||||
title: 'Обработка на сайте клиента',
|
||||
code: `window.addEventListener('message', (event) => {
|
||||
if (event.data?.type !== 'lendry-sso-onetap') return;
|
||||
// Проверяйте event.origin — домен вашего IdP
|
||||
const { token, idToken, accessToken, code, method } = event.data;
|
||||
console.log('Вход через', method);
|
||||
});`
|
||||
},
|
||||
{
|
||||
type: 'callout',
|
||||
variant: 'info',
|
||||
title: 'redirect_uri',
|
||||
text: 'redirect_uri должен быть зарегистрирован у OAuth-клиента. Для SPA часто используют https://your-app.com/auth/callback — на этой странице backend обменивает code на токены, либо popup передаёт токен через postMessage.'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'verify-token',
|
||||
title: 'Проверка токена на backend',
|
||||
blocks: [
|
||||
{
|
||||
type: 'paragraph',
|
||||
text: 'FedCM возвращает id_token (JWT). Проверьте подпись (HS256, секрет JWT_ACCESS_SECRET IdP), issuer = PUBLIC_API_URL и aud = ваш client_id. Альтернатива — обмен authorization code через POST /oauth/token и запрос GET /oauth/userinfo.'
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
items: [
|
||||
'Не доверяйте id_token только на frontend — всегда валидируйте на сервере',
|
||||
'client_secret храните только на backend при обмене code → token',
|
||||
'После проверки создайте локальную сессию пользователя (cookie / JWT вашего приложения)'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'examples',
|
||||
title: 'Примеры интеграции',
|
||||
blocks: [{ type: 'one-tap-examples' }]
|
||||
},
|
||||
{
|
||||
id: 'local-dev',
|
||||
title: 'Локальная разработка',
|
||||
blocks: [
|
||||
{
|
||||
type: 'table',
|
||||
headers: ['Сервис', 'URL'],
|
||||
rows: [
|
||||
['API (FedCM endpoints)', 'http://localhost:3000'],
|
||||
['Frontend (sso-widget.js)', 'http://localhost:3002/sso-widget.js'],
|
||||
['Документация', 'http://localhost:3003/docs/one-tap-login']
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'callout',
|
||||
variant: 'tip',
|
||||
title: 'Тест FedCM локально',
|
||||
text: 'FedCM cookie в dev использует SameSite=Lax (без Secure). Войдите на http://localhost:3002, затем откройте тестовую страницу клиента с подключённым виджетом. Chrome может требовать флаг chrome://flags/#identity-credentials-api или HTTPS для FedCM — в этом случае проверяйте popup fallback.'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
slug: 'ldap',
|
||||
title: 'LDAP / LDAPS',
|
||||
|
||||
Reference in New Issue
Block a user