Перейти к основному содержанию
Аутентификация появилась недавно. Каждый вызов на этой странице использует учётные данные конечного пользователя или не использует их вовсе. Никогда не отправляйте на эти endpoint’ы ваш API-ключ верификации или токен консоли.
Каждое приложение является отдельным эмитентом OpenID Connect. Эмитентом является источник входа вашего приложения:
  • 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 минут.
Серверные endpoint’ы этой страницы (discovery, ключи, tokens и сессия) описаны в справочнике Authentication API, который сформирован из openapi-authentication.json. Размещённая страница входа в этот справочник не входит.

Discovery и ключи

Эмитент поддерживает:
  • Тип ответа code и режим ответа query.
  • Типы грантов authorization_code и refresh_token.
  • Только метод PKCE S256. Клиенты публичные: client secret отсутствует, а client_id равен ID вашего приложения.
  • Алгоритм подписи ES256 (ключи P-256).
  • Области действия openid, email, phone, profile и offline_access.
Endpoint’ов userinfo, introspection и end-session нет, и 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-токен.

Проверка токена на вашем сервере

Проверьте всё перечисленное, прежде чем доверять какому-либо утверждению:
  1. alg равен ES256, а typ равен at+jwt. Отклоняйте любой другой алгоритм, включая none.
  2. kid есть в JWKS вашего приложения, а подпись успешно проверяется.
  3. iss совпадает с настроенным издателем, а aud совпадает с ID вашего приложения.
  4. exp и iat корректны с допуском до 60 секунд расхождения часов, а sub, sid и jti присутствуют.
  5. 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, если верификации нет, тогда как токены содержат {}.

Обновление токенов

Обновление возвращает новый access-токен, ID-токен и refresh-токен, а отправленный вами refresh-токен перестаёт работать.
  • 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 или журналы.
Перейдите к быстрому старту для JavaScript, быстрому старту для Next.js или к справочнику по Authentication API.
Последнее изменение 7 ноября 2026 г.