> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Получить конфигурацию OpenID | Didit Authentication API

> GET /.well-known/openid-configuration возвращает документ обнаружения OpenID Connect от Didit: издатель, эндпоинты, типы грантов, ES256 и claims.

> [!WARNING]
>
> Аутентификация это новая функция. Эти эндпоинты обслуживаются эмитентом вашего приложения, например `https://<name>.auth.didit.me`, и никогда не принимают ваш API-ключ Didit.

Получайте метаданные обнаружения только от настроенного вами эмитента, а не с URL, который вы прочитали в токене. Ответ можно кешировать на 5 минут. Значение каждого поля для вашей интеграции описано в разделе [Токены и JWKS](https://docs.didit.me/ru/authentication/tokens-and-jwks.md#discovery-и-ключи).


## OpenAPI

````yaml ru/openapi-authentication.json GET /.well-known/openid-configuration
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Серверные endpoints Didit Authentication, продукта для входа конечных
    пользователей вашего приложения. Authentication является **новым**
    продуктом, который выходит в продакшн в релизе 2026-11-01.


    ## Базовый URL


    Каждое приложение является собственным издателем (issuer) OpenID Connect, и
    каждый приведенный ниже endpoint обслуживается в корне этого издателя:


    - `https://<name>.auth.didit.me` для продакшн-приложения или
    `https://<name>.sandbox.auth.didit.me` для приложения в песочнице.

    - Ваш собственный кастомный домен после его активации. В этом случае он
    заменяет хост по умолчанию в качестве издателя: новые токены указывают его в
    `iss`, discovery указывает на него, а публичный ключ (publishable key)
    меняется. Access token, выпущенные под хостом по умолчанию, возвращают
    ошибку при вызове `/session/`, `/step-up/` и `/monitoring-token/` до тех
    пор, пока не будут обновлены.


    Продакшн и песочница являются раздельными приложениями, поэтому они
    представляют собой отдельных издателей с раздельными ключами. Публичный ключ
    состоит из префикса `pk_live_` (продакшн) или `pk_test_` (песочница), за
    которым следует base64url-кодировка издателя без паддинга и без завершающего
    слеша: декодируйте его, чтобы узнать издателя. Это публичный идентификатор,
    а не учетные данные.


    Те же JSON endpoints также обслуживаются по адресу
    `https://apx.didit.me/auth/v2/authentication/{application_id}/`. Токены
    всегда указывают издателя, описанного выше, независимо от адреса, через
    который они были выпущены.


    ## Учетные данные


    Эти endpoints никогда не принимают ваш API-ключ Didit или token консоли.


    - Discovery, JWKS и `POST /token/` не требуют учетных данных. Клиенты
    являются публичными: секрет клиента (client secret) отсутствует, а код
    авторизации привязан к верификатору PKCE (`S256`). `client_id` является
    идентификатором вашего приложения (application ID).

    - `/session/`, `/step-up/` и `/monitoring-token/` принимают access token
    пользователя: `Authorization: Bearer <access_token>`. Каждый успешный вызов
    считается активностью в сессии и сбрасывает таймаут неактивности сессии.


    ## Тела запросов


    Каждый endpoint, принимающий тело запроса, поддерживает JSON, form-encoded и
    multipart. В этом документе приведены JSON, а также form-encoded для `POST
    /token/`, как его отправляют OAuth-клиенты. Если endpoint не принимает поле,
    возвращается `400 {"<field>": "unknown_field"}`.


    ## Токены


    - **Access token**: JWT с алгоритмом ES256 и заголовком `typ: at+jwt`,
    действительный не более 5 минут и не дольше самой сессии. Утверждения:
    `AccessTokenClaims`.

    - **ID token**: JWT с алгоритмом ES256 и заголовком `typ: JWT`. Утверждения:
    `IDTokenClaims`. Он никогда не принимается в качестве access token.

    - **Refresh token**: случайная строка, которая ротируется при каждом
    использовании. Повторная отправка уже использованного refresh token приводит
    к отзыву сессии.


    Проверяйте token с помощью ключей из `GET /.well-known/jwks.json`: алгоритм
    должен быть `ES256`, `typ` должен соответствовать типу токена, `iss` должен
    совпадать с настроенным вами издателем, а `aud` с идентификатором вашего
    приложения. Офлайн-проверка распознает отозванную сессию только после
    истечения срока действия ее access token; `GET /session/` выполняет
    мгновенную проверку.


    ## Ошибки


    | Тело | Когда возвращается |

    | --- | --- |

    | `{"error": "<code>"}` | Ошибки от `POST /token/`, все со статусом `400`, в
    формате тела [RFC 6749 раздел
    5.2](https://www.rfc-editor.org/rfc/rfc6749#section-5.2): `invalid_grant`,
    `invalid_client` и Didit `mfa_required`. Ошибки сервиса:
    `temporarily_unavailable`, `monitoring_unavailable`, `monitoring_disabled`.
    |

    | `{"<field>": ["<message>"]}` или `{"<field>": "<code>"}` | Поле запроса не
    прошло валидацию. `non_field_errors` указывает на правило для нескольких
    полей, а `unknown_field` указывает на поле, которое endpoint не принимает. |

    | `{"detail": "<message>"}` | `401` (`invalid_token`), `403`
    (`origin_not_allowed`), `404` (неизвестное приложение или step-up) и `429`
    (лимит запросов). Также `400` для тела, которое невозможно распарсить (`JSON
    parse error - ...`), `405` для метода, который endpoint не поддерживает, и
    `415` для неподдерживаемого `Content-Type`. |


    Ответ `401` также содержит заголовок `WWW-Authenticate: Bearer`, а `429`
    содержит `Retry-After` в секундах.


    Два отказа не возвращают JSON. Запрос к адресу, не являющемуся издателем,
    отклоняется до попадания на эти endpoints, например, пустым ответом `404`
    для неиспользуемого имени `*.auth.didit.me`. Если `step_up_id` не является
    UUID, возвращается страница `404`.


    ## Лимиты запросов


    Запрос должен пройти два уровня проверок.


    **Лимиты endpoints**, рассчитываемые на IP-адрес клиента, на приложение и на
    endpoint:


    - Discovery и JWKS: 1 200 запросов в минуту и 12 000 в час.

    - Все остальные endpoints: 30 запросов в минуту и 300 в час. `GET` и `DELETE
    /session/` используют общий счетчик.


    Превышение лимита: `429 {"detail": "Too many requests from this IP address.
    Please wait before trying again. Expected available in 60 seconds."}`, или
    `3600 seconds` для часового лимита.


    **Защита от ботов**, применяется к каждому запросу `POST` и `DELETE`. Её
    лимитные корзины являются общими для всех запросов `POST` и `DELETE`
    приложения, включая размещённые шаги входа, и пополняются непрерывно:


    - 60 запросов в минуту на IP-адрес клиента.

    - 30 запросов в минуту на устройство для запросов, которые идентифицируют
    устройство, как это делают браузерные и нативные SDK.

    - 3 000 запросов в минуту для всего приложения со всех IP-адресов.
    Обновления токенов (`POST /token/` с `grant_type=refresh_token`) вместо
    этого используют отдельную корзину: 6 000 в минуту для всего приложения.


    Превышение корзины: `429 {"detail": "rate_limited Expected available in N
    seconds."}` (`1 second.`, когда N равно 1). Корзина на IP-адрес действует
    для всех endpoints, поэтому один адрес, отправляющий вперемешку запросы на
    получение токена, step-up и выход из системы, может исчерпать ее до
    достижения любого лимита endpoint. Корзина приложения учитывает каждого
    клиента приложения, включая браузеры.


    Оба уровня возвращают ответ до выполнения endpoint, поэтому запрос,
    получивший статус `429`, не был выполнен: повторите его по прошествии
    времени из `Retry-After`, включая запросы на обновление токена.


    ## Браузерные запросы


    Запрос, содержащий заголовок `Origin`, должен исходить из одного из
    собственных источников приложения или из списка его разрешённых источников,
    иначе он возвращает ошибку `403 origin_not_allowed`. Межсерверные запросы
    (server-to-server) не отправляют `Origin`.


    ## Не рассматривается в этом документе


    Эти маршруты обслуживают размещенные страницы, браузерные и нативные SDK, а
    также AI-агентов. Они не входят в серверный контракт, и серверные SDK их не
    вызывают:


    - Шаги входа: `POST /authorize/`, `POST /password/`, `/email/*`, `/phone/*`,
    `/password-reset/*`, `/passkeys/*`, `/mfa/*`, `/social/*` и
    `/protection/complete/`.

    - Размещенные страницы и обратные вызовы: `/sign-in`, `/magic`, `/invite`,
    `/reset`, `/verify/`, `/sso/*`, `/wallet/callback/`, `/logo/` и файлы
    ассоциации нативных приложений в `/.well-known/`.

    - Доступ для агентов: `/agents/*` и `/grants/`, включая `GET
    /agents/session/`, оперативную проверку access token AI-агента. Доступ для
    агентов не входит в эту версию контракта.

    - API управления в консоли для Authentication, принимающий сессии консоли.


    События Authentication пока не доставляются через webhook, поэтому в этом
    документе webhook не описан.
servers:
  - url: https://{issuer}
    description: 'Эмитент вашего приложения: его источник авторизации.'
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          Хост эмитента: `<name>.auth.didit.me` (продакшн),
          `<name>.sandbox.auth.didit.me` (песочница) или ваш активный кастомный
          домен.
security: []
tags:
  - name: Issuer
    description: Ключи обнаружения и подписи для проверки токенов.
  - name: Tokens
    description: Гранты authorization code и refresh.
  - name: Sessions
    description: Проверить и завершить сессию, связанную с токеном доступа.
  - name: Step-ups
    description: Верификация перед выполнением конфиденциального действия.
  - name: Monitoring
    description: Учётные данные устройства для событий мониторинга транзакций.
paths:
  /.well-known/openid-configuration:
    get:
      tags:
        - Issuer
      summary: Получить конфигурацию OpenID
      description: >-
        Документ обнаружения эмитента: его endpoint'ы, гранты, алгоритм подписи
        и утверждения. Получайте его от настроенного вами эмитента, ни в коем
        случае не из URL, найденного в token. Кэшируйте его на срок до 5 минут,
        как указано в `Cache-Control`.
      operationId: authentication_get_openid_configuration
      responses:
        '200':
          description: Документ обнаружения.
          headers:
            Cache-Control:
              description: >-
                `public, max-age=300`: вы и общие кэши можете хранить успешный
                ответ в течение 5 минут, что соответствует времени жизни одного
                токена доступа.
              schema:
                type: string
                example: public, max-age=300
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenIDConfiguration'
              examples:
                Discovery:
                  summary: Приложение в продакшне
                  value:
                    issuer: https://your-app.auth.didit.me
                    authorization_endpoint: https://your-app.auth.didit.me/sign-in
                    token_endpoint: https://your-app.auth.didit.me/token/
                    jwks_uri: https://your-app.auth.didit.me/.well-known/jwks.json
                    response_types_supported:
                      - code
                    response_modes_supported:
                      - query
                    grant_types_supported:
                      - authorization_code
                      - refresh_token
                    subject_types_supported:
                      - public
                    id_token_signing_alg_values_supported:
                      - ES256
                    token_endpoint_auth_methods_supported:
                      - none
                    code_challenge_methods_supported:
                      - S256
                    scopes_supported:
                      - openid
                      - email
                      - phone
                      - profile
                      - offline_access
                    claims_supported:
                      - iss
                      - aud
                      - sub
                      - sid
                      - auth_time
                      - nonce
                      - vendor_data
                      - amr
                      - org
                      - verified
                      - act
                      - email
                      - email_verified
                      - name
                      - phone_number
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    OpenIDConfiguration:
      type: object
      description: >-
        Документ обнаружения OpenID Connect эмитента. Считывайте endpoint'ы
        отсюда, а не создавайте их вручную.
      required:
        - issuer
        - authorization_endpoint
        - token_endpoint
        - jwks_uri
        - response_types_supported
        - response_modes_supported
        - grant_types_supported
        - subject_types_supported
        - id_token_signing_alg_values_supported
        - token_endpoint_auth_methods_supported
        - code_challenge_methods_supported
        - scopes_supported
        - claims_supported
      properties:
        issuer:
          type: string
          format: uri
          description: >-
            Эмитент: источник входа приложения без косой черты на конце. Ему
            равен `iss` каждого token.
          example: https://your-app.auth.didit.me
        authorization_endpoint:
          type: string
          format: uri
          description: Размещённая страница входа (`/sign-in`).
          example: https://your-app.auth.didit.me/sign-in
        token_endpoint:
          type: string
          format: uri
          example: https://your-app.auth.didit.me/token/
        jwks_uri:
          type: string
          format: uri
          example: https://your-app.auth.didit.me/.well-known/jwks.json
        response_types_supported:
          type: array
          items:
            type: string
          example:
            - code
        response_modes_supported:
          type: array
          items:
            type: string
          example:
            - query
        grant_types_supported:
          type: array
          items:
            type: string
          example:
            - authorization_code
            - refresh_token
        subject_types_supported:
          type: array
          items:
            type: string
          example:
            - public
        id_token_signing_alg_values_supported:
          type: array
          items:
            type: string
          example:
            - ES256
        token_endpoint_auth_methods_supported:
          type: array
          items:
            type: string
          description: '`none`: клиенты являются публичными и не передают секрет.'
          example:
            - none
        code_challenge_methods_supported:
          type: array
          items:
            type: string
          example:
            - S256
        scopes_supported:
          type: array
          items:
            type: string
          example:
            - openid
            - email
            - phone
            - profile
            - offline_access
        claims_supported:
          type: array
          items:
            type: string
          example:
            - iss
            - aud
            - sub
            - sid
            - auth_time
            - nonce
            - vendor_data
            - amr
            - org
            - verified
            - act
            - email
            - email_verified
            - name
            - phone_number
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    OAuthError:
      title: OAuth error
      type: object
      description: Ошибка OAuth (RFC 6749, раздел 5.2) или ошибка сервиса.
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
  responses:
    OriginNotAllowed:
      description: >-
        Запрос содержал заголовок `Origin`, который не принадлежит приложению и
        не входит в его список разрешённых источников. Серверные запросы не
        отправляют `Origin`.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: Источник (origin) не разрешен
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        Адрес принадлежит приложению, но Authentication для него не активна; для
        адреса `apx.didit.me` идентификатор приложения неизвестен. Запрос к
        адресу, не принадлежащему ни одному приложению, отклоняется до того, как
        достигнет endpoint, и этот ответ возвращается не в формате JSON.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: Неизвестное приложение
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        Слишком много запросов с этого IP-адреса для данного endpoint, либо при
        вызове `POST` или `DELETE` исчерпан лимит защиты от ботов. Ничего не
        было выполнено: подождите количество секунд, указанное в `Retry-After`,
        затем повторите попытку.
      headers:
        Retry-After:
          description: Количество секунд ожидания перед повторной попыткой.
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: Лимит запросов к endpoint
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: Лимит защиты от ботов (POST и DELETE)
              value:
                detail: rate_limited Expected available in 2 seconds.
    TemporarilyUnavailable:
      description: >-
        Сервис, от которого зависит запрос, временно недоступен. Повторите
        попытку с задержкой.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OAuthError'
          examples:
            TemporarilyUnavailable:
              summary: Повторить попытку позже
              value:
                error: temporarily_unavailable

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.