https://<name>.auth.didit.meдля продакшн-приложения,https://<name>.sandbox.auth.didit.meдля приложения в песочнице,- или ваш собственный домен, после его активации.
DIDIT_AUTH_ISSUER равным вашему эмитенту без завершающего слеша, а DIDIT_APPLICATION_ID равным ID вашего приложения: tokens передают его в aud. Ваш публикуемый ключ кодирует эмитент: после pk_live_ или pk_test_ идёт эмитент в base64url без дополнения.
Когда ваш собственный домен станет активным, он заменит домен по умолчанию в качестве эмитента. Новые tokens будут указывать его в
iss, документ обнаружения будет указывать в jwks_uri этот домен, а ваш publishable key изменится. Токены доступа, выданные на домене по умолчанию, будут отклоняться в GET /session/, пока их не обновят. Обновите DIDIT_AUTH_ISSUER при активации домена или принимайте оба эмитента, пока не истекут старые токены, но не дольше 5 минут.Discovery и ключи
Эмитент поддерживает:
- Тип ответа
codeи режим ответаquery. - Типы грантов
authorization_codeиrefresh_token. - Только метод PKCE
S256. Клиенты публичные: client secret отсутствует, аclient_idравен ID вашего приложения. - Алгоритм подписи
ES256(ключи P-256). - Области действия
openid,email,phone,profileиoffline_access.
prompt=none не поддерживается. Используйте GET /session/, чтобы считать и проверить сессию.
Кеширование и ротация
Оба документа отвечаютCache-Control: public, max-age=300, поэтому вы и общие кеши можете хранить их 5 минут. Они допускают 1,200 запросов в минуту и 12,000 в час на IP-адрес, что намного больше лимитов endpoint’ов входа, потому что у многих экземпляров серверной части часто бывает один общий адрес.
- У каждого ключа есть
kid; идентификаторы новых ключей начинаются сk_. Каждый token называет свой ключ в заголовкеkid. - Ключи меняются каждые 30 дней. Didit публикует следующий ключ за день до начала подписи и держит предыдущий опубликованным ещё день после того, как он перестал подписывать. Поэтому JWKS, закешированный на 5 минут, позволяет проверять токены и во время ротации.
- Кешируйте ключи по
kid. Если token называетkid, которого у вас нет, заново запросите JWKS не чаще раза в минуту и отклоняйте token, если ключ всё ещё отсутствует. - Когда Didit отзывает скомпрометированный ключ, он сразу удаляет ключ из JWKS, а
GET /session/отклоняет каждый token, подписанный этим ключом. Замещающий ключ начинает подписывать сразу, без дня предварительной публикации. JWKS, закешированный до 5 минут назад, всё ещё принимает отозванный ключ и пока не знает о замещающем, поэтому новые tokens могут не проходить офлайн-проверку, пока кеш не обновится.
Начало входа
Откройте размещённую страницу, которая являетсяauthorization_endpoint:
Быстрые старты формируют этот запрос за вас.
Обмен кода
Callback получаетcode и state. Проверьте state, затем обменяйте код в течение 60 секунд. Каждый код работает один раз. Тело запроса может быть представлено в формате JSON или в формате данных формы.
expires_in показывает, сколько секунд осталось до истечения access token. Если вы отключили возможность нескольких сессий, этот обмен завершает остальные сессии пользователя.
Утверждения access-токена
Access-токен представляет собой JWT с заголовкомalg: ES256 и typ: at+jwt. Он действует не более 5 минут и никогда не дольше своей сессии.
ID-токен имеет заголовок
typ: JWT. Он содержит те же утверждения, кроме client_id, а также auth_time и email_verified, и email, name и phone_number, если у них есть значение. Только ID-токен, полученный при обмене кода, содержит nonce, если при входе он был передан. Проверяйте его именно там, так как ID-токены, полученные при обновлении, никогда его не содержат. ID-токен никогда не принимается как access-токен.
Проверка токена на вашем сервере
Проверьте всё перечисленное, прежде чем доверять какому-либо утверждению:algравенES256, аtypравенat+jwt. Отклоняйте любой другой алгоритм, включаяnone.kidесть в JWKS вашего приложения, а подпись успешно проверяется.issсовпадает с настроенным издателем, аaudсовпадает с ID вашего приложения.expиiatкорректны с допуском до 60 секунд расхождения часов, аsub,sidиjtiприсутствуют.actравенnull. Access-токен ИИ-агента подписан тем же ключом и имеет те жеtyp,issиaud; отличает его толькоact. Отклоняйте его, если только эндпоинт не принимает агентов: тогда разрешайте только то, что разрешеноact.scopes.GET /session/всегда отклоняет токен агента.
GET /session/.
Проверка сессии
sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri и organizations. Каждая запись организации содержит organization_id, organization__name, role и custom_role.
Эта проверка строже офлайн-проверки. Она также завершается ошибкой, если сессия была отозвана, простаивала дольше допустимого времени простоя или превысила срок жизни, если человек заблокирован или его адрес электронной почты больше не подтверждён, если сессия больше не соответствует вашей политике MFA (например, после того как человек добавил приложение-аутентификатор или стал администратором организации), или если токен был заменён при обновлении. При ошибке возвращается 401 {"detail": "invalid_token"} с заголовком WWW-Authenticate: Bearer.
GET /session/ допускает 30 запросов в минуту и 300 в час с одного IP-адреса; этот лимит общий с DELETE /session/. Проверяйте токены офлайн при каждом запросе и оставляйте этот вызов для случаев, когда он действительно нужен. Каждый успешный вызов считается активностью и перезапускает idle_timeout сессии.
Подтверждённая электронная почта не является верификацией личности. Для этого читайте verified: здесь оно равно null, если верификации нет, тогда как токены содержат {}.
Обновление токенов
- Refresh-токен представляет собой случайную строку, которая действительна до окончания сессии.
- Повторное использование завершает сессию. Если использованный refresh-токен приходит повторно, Didit расценивает это как признак кражи: сессия отзывается, и возвращается
400 {"error": "invalid_grant"}. Токены сессии также перестают работать, включая токены, полученные при предыдущем обновлении: их refresh-токен перестаёт работать, а access-токен сразу перестаёт проходитьGET /session/. Однако офлайн он ещё проверяется до истечения срока, то есть в течение 5 минут. - Выполняйте одно обновление за раз для сессии, во всех вкладках, на всех устройствах и на всех экземплярах сервера, и заменяйте все три токена одновременно.
- Если запрос обновления завершился ошибкой
400или на него не пришёл ответ, начните вход заново. Не повторяйте запрос вслепую: повтор после успешного обновления и есть повторное использование. - Ответ
503 {"error": "temporarily_unavailable"}означает, что обновление не произошло и ваш refresh-токен всё ещё работает. Повторите запрос с увеличением интервала между попытками. - Didit возвращает
429до выполнения обновления, поэтому повторите запрос послеRetry-After. Эндпоинт токенов допускает 30 запросов в минуту и 300 в час с одного IP-адреса. Кроме того, каждыйPOSTиDELETEвашего приложения использует общие бакеты защиты от ботов: 60 запросов в минуту с одного IP-адреса на все эти эндпоинты и 30 в минуту с одного устройства. Для всего приложения обновления имеют бакет 6 000 в минуту, а все остальныеPOSTиDELETE(включая браузеры и шаги входа) имеют бакет 3 000 в минуту, поэтому обновления не исчерпывают лимит входов. - При 5-минутных access-токенах 300 обновлений в час хватает примерно на 25 активных людей. Если ваш сервер обновляет токены для многих людей с одного адреса, обновляйте только тогда, когда запросу нужен новый токен, и по возможности обновляйте в браузере или приложении.
Выход из системы
DELETE /session/ с текущим access token пользователя завершает сессию и возвращает 204. Её refresh token перестаёт работать, а её access tokens сразу начинают давать ошибку при вызове GET /session/. Tokens, которые вы проверяете офлайн, остаются действительными до истечения срока. Затем перенаправьте пользователя на post_logout_redirect_uri, если вы его задали.
Для выхода нужен access token, который приняла бы GET /session/: он не должен быть просроченным и не должен быть заменён в результате обновления. Ответ 401 означает, что сессия не завершена. Обновите токен, затем выполните выход с новым access token. Если обновление завершается ошибкой 400, сессию использовать больше нельзя.
Сессия также завершается, когда:
- она превышает
session_lifetime(по умолчанию 30 дней) илиidle_timeout(по умолчанию 1 день), - пользователь входит снова, а несколько сессий отключены,
- пользователь меняет пароль, а
revoke_on_password_changeвключён, - ваша команда отзывает сессию или блокирует пользователя в консоли,
- использованный refresh token отправляется повторно.
Сроки действия
Хранение учётных данных по назначению
- Храните API-ключи для верификации и tokens консоли на своём сервере.
- По возможности храните access tokens браузера в памяти. В приложениях с серверным рендерингом используйте cookie с флагами Secure и HttpOnly и защищайте запросы с аутентификацией через cookie от CSRF.
- Храните refresh tokens мобильных приложений в защищённом хранилище платформы. После выхода очищайте локальное состояние.
- Никогда не помещайте tokens в URL или журналы.