> ## 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.

# トークンエンドポイント：コード交換と更新 | Didit認証API

> DiditのPOST /token/は、PKCE認可コードをトークンに交換するか、リフレッシュトークンをローテーションします。リフレッシュトークンを再利用するとセッションは失効します。

> [!WARNING]
>
> Authenticationは新しい機能です。これらのエンドポイントは`https://<name>.auth.didit.me`のようなアプリケーションのissuerから提供され、DiditのAPIキーを受け付けることはありません。

リフレッシュトークンは1回しか使用できません。使用済みのリフレッシュトークンを再度送信するとセッション全体が無効化されるため、1つのセッションでは一度に1つのリフレッシュのみを実行し、3つのトークンすべてをまとめて置き換えてください。詳しくは[リフレッシュトークン](https://docs.didit.me/ja/authentication/tokens-and-jwks.md#リフレッシュトークン)を参照してください。


## OpenAPI

````yaml ja/openapi-authentication.json POST /token/
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Didit Authenticationのサーバー向けエンドポイントです。Didit
    Authenticationは、アプリケーションのエンドユーザー向けのサインイン製品です。Authenticationは**新しい**製品で、2026-11-01リリースで本番環境に提供されます。


    ## ベースURL


    各アプリケーションはそれぞれ独自のOpenID
    Connect発行者（issuer）であり、以下のすべてのエンドポイントはその発行者のルートで提供されます。


    -
    本番環境のアプリケーションでは`https://<name>.auth.didit.me`、サンドボックスのアプリケーションでは`https://<name>.sandbox.auth.didit.me`。

    -
    有効化された独自のカスタムドメイン。有効化されると、デフォルトのホストに代わってこのドメインが発行者になります。新しいトークンの`iss`にはこのドメインが記載され、ディスカバリーはこのドメインを指し、公開可能キー（publishable
    key）が変わります。デフォルトのホストで発行されたアクセストークンは、更新されるまで`/session/`、`/step-up/`、`/monitoring-token/`で失敗します。


    本番環境とサンドボックスは別々のアプリケーションであるため、それぞれ別の発行者となり、キーも別です。公開可能キーは、`pk_live_`（本番環境）または`pk_test_`（サンドボックス）の後に、末尾のスラッシュを除いた発行者をパディングなしのbase64urlでエンコードした文字列が続く形式です。デコードすると発行者がわかります。これは公開識別子であり、認証情報ではありません。


    同じJSONエンドポイントは`https://apx.didit.me/auth/v2/authentication/{application_id}/`でも提供されます。どのアドレスから発行されたかにかかわらず、トークンには常に上記の発行者が記載されます。


    ## 認証情報


    これらのエンドポイントは、DiditのAPIキーやコンソールトークンを受け付けることはありません。


    - ディスカバリー、JWKS、`POST
    /token/`には認証情報は不要です。クライアントはパブリッククライアントです。クライアントシークレットはなく、認可コードはそのPKCE検証子（`S256`）に紐付けられます。`client_id`はアプリケーションIDです。

    -
    `/session/`、`/step-up/`、`/monitoring-token/`には本人のアクセストークンを渡します（`Authorization:
    Bearer
    <access_token>`）。呼び出しが成功するたびにセッションのアクティビティとしてカウントされるため、セッションのアイドルタイムアウトがリセットされます。


    ## リクエストボディ


    ボディを受け取るすべてのエンドポイントは、JSON、フォームエンコード、マルチパートのボディを受け付けます。このドキュメントではJSONを記載し、`POST
    /token/`についてはOAuthクライアントが送信する形式であるフォームエンコードも記載します。エンドポイントが受け付けないフィールドには`400
    {"<field>": "unknown_field"}`が返されます。


    ## トークン


    - **アクセストークン**：ヘッダーが`typ: at+jwt`のES256
    JWTで、有効期間は最大5分であり、セッションの有効期間を超えることはありません。クレーム：`AccessTokenClaims`。

    - **IDトークン**：ヘッダーが`typ: JWT`のES256
    JWTです。クレーム：`IDTokenClaims`。アクセストークンとして受け付けられることはありません。

    -
    **リフレッシュトークン**：使用するたびにローテーションされるランダムな文字列です。使用済みのリフレッシュトークンを再度送信すると、セッションが取り消されます。


    トークンは`GET
    /.well-known/jwks.json`のキーで検証してください。アルゴリズムは`ES256`でなければならず、`typ`はトークンの種類と、`iss`は設定した発行者と、`aud`はアプリケーションIDと一致しなければなりません。オフライン検証では、取り消されたセッションはそのアクセストークンの有効期限が切れた時点で初めて検出されます。即時に確認するには`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`はエンドポイントが受け付けないフィールドを示します。
    |

    | `{"detail": "<message>"}` |
    `401`（`invalid_token`）、`403`（`origin_not_allowed`）、`404`（不明なアプリケーションまたはステップアップ）、`429`（レート制限）。また、解析できないボディには`400`（`JSON
    parse error -
    ...`）、エンドポイントが提供していないメソッドには`405`、サポートされていない`Content-Type`には`415`が返されます。 |


    `401`には`WWW-Authenticate: Bearer`も含まれ、`429`には秒単位の`Retry-After`が含まれます。


    JSON以外で返される拒否が2つあります。発行者ではないアドレスは、これらのエンドポイントに到達する前に拒否されます。たとえば、使用されていない`*.auth.didit.me`の名前には空の`404`が返されます。UUIDではない`step_up_id`には`404`ページが返されます。


    ## レート制限


    リクエストは2つのレイヤーを通過する必要があります。


    **エンドポイントの制限**：クライアントのIPアドレスごと、アプリケーションごと、エンドポイントごとにカウントされます。


    - ディスカバリーとJWKS：1分あたり1,200リクエスト、1時間あたり12,000リクエスト。

    - その他すべてのエンドポイント：1分あたり30リクエスト、1時間あたり300リクエスト。`GET`と`DELETE
    /session/`は1つのカウントを共有します。


    制限を超えた場合：`429 {"detail": "Too many requests from this IP address. Please
    wait before trying again. Expected available in 60
    seconds."}`が返されます。1時間あたりの制限では`3600 seconds`になります。


    **ボット対策**：すべての`POST`と`DELETE`に適用されます。そのバケットは、ホスト型のサインインステップを含むアプリケーションのすべての`POST`および`DELETE`リクエストで共有され、継続的に補充されます。


    - クライアントのIPアドレスごとに1分あたり60リクエスト。

    - デバイスを識別するリクエスト（ブラウザSDKやネイティブSDKが送信するもの）について、デバイスごとに1分あたり30リクエスト。

    - アプリケーション全体で、すべてのIPアドレスを合わせて1分あたり1,000リクエスト。


    バケットを超えた場合：`429 {"detail": "rate_limited Expected available in N
    seconds."}`が返されます（Nが1の場合は`1
    second.`）。IPごとのバケットはエンドポイントをまたいで適用されるため、トークン、ステップアップ、サインアウトの呼び出しを混在させる1つのアドレスは、いずれかのエンドポイントの制限に達する前にバケットを使い切る可能性があります。アプリケーションのバケットは、ブラウザを含むアプリケーションのすべてのクライアントをカウントします。


    どちらのレイヤーもエンドポイントが実行される前に応答するため、`429`を受け取ったリクエストは実行されていません。`Retry-After`の経過後に再試行してください。リフレッシュも同様です。


    ## ブラウザからのリクエスト


    `Origin`ヘッダーを含むリクエストは、アプリケーション自身のオリジンまたは許可されたオリジンのいずれかから送信されたものでなければならず、そうでない場合は`403
    origin_not_allowed`が返されます。サーバー間のリクエストは`Origin`を送信しません。


    ## このドキュメントの対象外


    これらのルートは、ホスト型ページ、ブラウザSDKとネイティブ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/`。AIエージェントのアクセストークンをリアルタイムで確認する`GET
    /agents/session/`も含みます。エージェントアクセスは、このバージョンの仕様には含まれません。

    - Authenticationのコンソール管理API。コンソールセッションを使用します。


    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: 認可コードグラントとリフレッシュグラント。
  - name: Sessions
    description: アクセストークンに紐づくセッションを確認して終了します。
  - name: Step-ups
    description: 機密性の高いアクションの前に行う認証。
  - name: Monitoring
    description: トランザクションモニタリングイベント用のデバイス認証情報です。
paths:
  /token/:
    post:
      tags:
        - Tokens
      summary: コードの交換またはトークンの更新
      description: >-
        両方のグラントに対応するトークンエンドポイントです。


        -
        `authorization_code`は、`redirect_uri`が受け取ったコードを、アクセストークン、IDトークン、リフレッシュトークンと交換します。コードは1回限り、60秒以内に、PKCE
        verifierとそのサインイン時と完全に同じ`redirect_uri`を使用した場合にのみ有効です。アプリケーションが1人につき1セッションのみを許可している場合、交換によってその人の他のセッションは終了します。

        -
        `refresh_token`は新しいアクセストークン、IDトークン、リフレッシュトークンを返し、送信したリフレッシュトークンは使用できなくなります。**使用済みのリフレッシュトークンを再送するとセッションが失効し**、`invalid_grant`が返されます。そのため、1つのセッションでは一度に1つのリフレッシュのみを実行し、3つのトークンをすべてまとめて置き換えてください。リフレッシュが`400`で失敗した場合、または応答がない場合は、再試行せずにサインインをやり直してください。実際には成功していたリフレッシュの後に再試行すると、再利用とみなされます。`429`はリフレッシュの実行前に返されるため、`Retry-After`の後に安全に再試行できます。`503`はリフレッシュが行われておらず、リフレッシュトークンがまだ有効であることを意味します。バックオフを入れて再試行してください。


        ボディはJSONまたはフォームエンコード形式で送信できます。
      operationId: authentication_token
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            examples:
              AuthorizationCode:
                summary: 認可コードを交換する
                value:
                  grant_type: authorization_code
                  code: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
                  code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
                  redirect_uri: https://app.example.com/auth/callback
              RefreshToken:
                summary: トークンを更新する
                value:
                  grant_type: refresh_token
                  refresh_token: >-
                    N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          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/TokenResponse'
              examples:
                Tokens:
                  summary: 新しいセッション用のトークン
                  value:
                    access_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
                    id_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
                    refresh_token: >-
                      N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
                    token_type: Bearer
                    expires_in: 299
                    session_id: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
        '400':
          description: >-
            グラントが失敗しました。`invalid_grant`:
            コードまたはリフレッシュトークンが不明、使用済み、または期限切れの場合、PKCEベリファイアーまたは`redirect_uri`が一致しない場合、もしくは`redirect_uri`が登録されていない場合、本人がブロックされた場合またはメールアドレスが認証済みでなくなった場合、セッションが終了した場合またはMFAポリシーを満たさなくなった場合、あるいはコードについては、その発行元のサインイン方法を無効にした場合です。サインイン方法を無効にしても、その方法ですでに開始されたセッションのリフレッシュは停止されません。`invalid_client`:
            `client_id`がアプリケーションIDではありません。`mfa_required`:
            サインインがMFAポリシーを満たしていません。フィールドエラーには、欠落しているか無効なフィールドの名前が示されます。解析できないボディには`detail`メッセージが返されます。
          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:
                anyOf:
                  - $ref: '#/components/schemas/OAuthError'
                  - $ref: '#/components/schemas/FieldErrors'
                  - $ref: '#/components/schemas/Detail'
              examples:
                InvalidGrant:
                  summary: コードまたはリフレッシュトークンが拒否された
                  value:
                    error: invalid_grant
                InvalidClient:
                  summary: client_idが正しくありません
                  value:
                    error: invalid_client
                MfaRequired:
                  summary: MFAポリシーを満たしていません
                  value:
                    error: mfa_required
                MissingFields:
                  summary: 必須フィールドが含まれていないグラント
                  value:
                    non_field_errors:
                      - invalid_request
                UnknownGrant:
                  summary: サポートされていないgrant_type
                  value:
                    grant_type:
                      - '"password" is not a valid choice.'
                UnknownField:
                  summary: エンドポイントが受け付けないフィールド
                  value:
                    foo: unknown_field
                MalformedBody:
                  summary: 解析できないJSON本文
                  value:
                    detail: >-
                      JSON parse error - Expecting property name enclosed in
                      double quotes: line 1 column 2 (char 1)
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    TokenRequest:
      description: >-
        `grant_type`で選択される2つのグラントのいずれかです。このエンドポイントは両方のグラントのフィールドを受け付け、受け取ったすべてのフィールドを検証します。そのため、不正な形式の`code_verifier`も含むリフレッシュはフィールドエラーになります。使用するグラントのフィールドのみを送信してください。それ以外のフィールドは`unknown_field`になります。
      oneOf:
        - $ref: '#/components/schemas/AuthorizationCodeGrantRequest'
        - $ref: '#/components/schemas/RefreshTokenGrantRequest'
      discriminator:
        propertyName: grant_type
        mapping:
          authorization_code: '#/components/schemas/AuthorizationCodeGrantRequest'
          refresh_token: '#/components/schemas/RefreshTokenGrantRequest'
    TokenResponse:
      type: object
      description: 1つのセッション用のトークン。リフレッシュ後は3つすべてをまとめて置き換えてください。
      required:
        - access_token
        - id_token
        - refresh_token
        - token_type
        - expires_in
        - session_id
      properties:
        access_token:
          type: string
          description: >-
            ES256 JWT（ヘッダー`typ: at+jwt`）。`Authorization: Bearer
            <access_token>`として送信してください。クレーム：`AccessTokenClaims`。
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
          x-didit-jwt:
            header: '#/components/schemas/AccessTokenHeader'
            claims: '#/components/schemas/AccessTokenClaims'
        id_token:
          type: string
          description: >-
            ES256 JWT（ヘッダー`typ:
            JWT`）。サインインしたユーザーをアプリケーションが読み取るためのものです。アクセストークンとしては絶対に送信しないでください。クレーム：`IDTokenClaims`。
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
          x-didit-jwt:
            header: '#/components/schemas/IDTokenHeader'
            claims: '#/components/schemas/IDTokenClaims'
        refresh_token:
          type: string
          description: 1回限り使用できます。セッションが終了するまで有効で、リフレッシュのたびに新しいものが返されます。
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        token_type:
          type: string
          enum:
            - Bearer
        expires_in:
          type: integer
          minimum: 0
          maximum: 300
          description: アクセストークンの有効期限までの秒数です。最大300で、セッションがそれより早く終了する場合はそれより短くなります。
          example: 299
        session_id:
          type: string
          format: uuid
          description: これらのトークンが属するセッション。`sid`クレームと同じ値です。
          example: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
    OAuthError:
      title: OAuth error
      type: object
      description: OAuthエラー（RFC 6749セクション5.2）またはサービスエラー。
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        フィールドごとのバリデーションエラー。値はメッセージのリスト、または単一のコード（`unknown_field`、`invalid_redirect_uri`）です。`non_field_errors`には複数のフィールドにまたがるルールのエラーが入ります。
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    AuthorizationCodeGrantRequest:
      title: Authorization code grant
      type: object
      description: リダイレクトで受け取った認可コードをトークンと交換します。コードは1回のみ、60秒間有効です。
      required:
        - grant_type
        - code
        - code_verifier
        - redirect_uri
      properties:
        grant_type:
          type: string
          enum:
            - authorization_code
        code:
          type: string
          maxLength: 128
          description: >-
            `redirect_uri`が受け取った`code`クエリパラメーターです。交換する前に、コールバックの`state`を確認してください。
          example: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
        code_verifier:
          type: string
          minLength: 43
          maxLength: 128
          pattern: ^[A-Za-z0-9._~-]{43,128}$
          description: S256ハッシュがサインイン時の`code_challenge`となったPKCEベリファイア。
          example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
        redirect_uri:
          type: string
          maxLength: 2048
          description: >-
            サインインの開始時に使用したものと完全に同じ`redirect_uri`です。引き続きアプリケーションのリダイレクトURIのいずれかである必要があります。
          example: https://app.example.com/auth/callback
        client_id:
          type: string
          maxLength: 64
          description: >-
            任意。送信する場合はアプリケーションIDと一致している必要があり、一致しない場合はリクエストが`invalid_client`で失敗します。
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            任意のパラメーターで、標準のOpenID
            Connectクライアントから受け付けられます。サインインで付与された範囲が広がることは決してありません。
          example: openid email
    RefreshTokenGrantRequest:
      title: Refresh token grant
      type: object
      description: >-
        リフレッシュトークンを新しいアクセストークン、IDトークン、リフレッシュトークンと交換します。リフレッシュトークンは1回しか使用できません。再度送信するとセッションが失効するため、1つのセッションに対するリフレッシュは一度に1つずつ実行してください。
      required:
        - grant_type
        - refresh_token
      properties:
        grant_type:
          type: string
          enum:
            - refresh_token
        refresh_token:
          type: string
          maxLength: 128
          description: 前回のトークンレスポンスに含まれる`refresh_token`です。
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        client_id:
          type: string
          maxLength: 64
          description: >-
            任意。送信する場合はアプリケーションIDと一致している必要があり、一致しない場合はリクエストが`invalid_client`で失敗します。
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            任意のパラメーターで、標準のOpenID
            Connectクライアントから受け付けられます。リフレッシュによってセッションが保持する範囲が広がることは決してありません。
          example: openid email
  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: 許可されていないオリジンです
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        このアドレスはアプリケーションに属していますが、そのアプリケーションでAuthenticationが有効になっていません。`apx.didit.me`のアドレスでは、アプリケーションIDが不明です。どのアプリケーションにも属さないアドレスはエンドポイントに到達する前に拒否され、そのレスポンスは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アドレスからのリクエストが多すぎるか、`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: エンドポイントの制限
              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.