Skip to content

はじめてのOpenID Connect

認証・認可プロトコルのOpenID Connectについてその業務処理を解説します。

登場人物

  • End user: 業務アプリケーションの利用者
  • Relying party (RP): 業務アプリケーションを提供するシステム
  • OpenID provider (OP): 認証を担うシステム

シーケンス図

%%{init:{'theme':'dark'}}%%

sequenceDiagram

    actor end_user as End user
    participant rp as RP
    participant op as OP

    autonumber
    end_user ->> rp: 業務API呼び出し
    rp ->+ end_user: 認可エンドポイントへリダイレクト
    end_user ->>-op: 認証リクエスト
        Note right of op: 認可エンドポイント
    op -->> end_user: ログイン画面
    end_user ->> op: ユーザ認証
    op ->+ end_user: 認証レスポンス
    end_user ->>- rp: リダイレクトURIへリダイレクト
    rp ->> op: トークンリクエスト
        Note right of op: トークンエンドポイント
    op -->> rp: トークンレスポンス
    rp ->> rp: IDトークン検証
    rp -->> end_user: ログインセッション

処理解説

1. 業務API呼び出し

ユーザが業務APIをコールした際にアクセストークンを持っていなければOIDCの認証フローに入ります。

2. 認可エンドポイントへリダイレクト

RPは認可エンドポイントへのリダイレクトを行います。

3. 認証リクエスト

認可エンドポイントへの認証リクエストは下記パラメータを含める必要があります:

パラメータ 説明
scope openid必須、他スコープ追加可能
response_type 認可コードフローの場合はcode固定
client_id クライアントを識別するID
redirect_uri 認証完了後にリダイレクトするURI
state 認可コード保護向けのランダム文字列
code_challenge code_verifierをハッシュ化した値
code_challenge_method S256固定
nonce ランダム文字列
  • stateは認証リクエストと認証レスポンスを対応付けることで、CSRF攻撃を防ぐためのパラメータです。 RP側はstateを生成・保持して認証リクエストを行います。OPは認証レスポンスにstateを含め、リダイレクトを用いてRPにその値を渡します。RPは帰ってきたstateと保持しているstateとを検証することで、当初のリクエストに対するレスポンスであることを確認します。
  • code_challengeおよびcode_challenge_methodはPKCE向けのパラメータで、認可コードの盗聴を防ぎます。RPはcode_verifierをランダム文字列として生成・保持し、ハッシュ化することでcode_challengeを作成します。OP側はcode_challengeと認可コードとを紐づけて保持します。トークンリクエスト時にRPはcode_verifierを送信します。OP側でその値をハッシュ化し、保持しているcode_challengeと一致することを確認します。
  • nonceIDトークンの再利用を防ぐためのパラメータです。RPはランダム文字列としてnonceを生成・保持して認証リクエストを行います。OP側はIDトークンのclaimにこの値を含めて返却します。RP側は受け取ったIDトークンに対し、そのnonceと保持しているnonceとを検証することで攻撃者によって挿入された認可コードでないことを確認します。

4. ログイン画面

ID/Passなどを入力するログイン画面を返却します。

5. ユーザ認証

上記画面から認証情報を送信します。

6. 認証レスポンス

認証レスポンスには下記を含める必要があります:

パラメータ 説明
code 認可コード
state 認証リクエストで受け取ったそれと同じランダム文字列

7. リダイレクトURIへリダイレクト

認証が完了するとリダイレクトを用いて認可コードをRPに渡します。リダイレクト先はredirect_uriで指定したURIです。

8. トークンリクエスト

IDトークンを要求するトークンリクエストには下記パラメータを含める必要があります:

パラメータ 説明
grant_type authorization_code固定
code 認可コード
redirect_uri 認可コード付与時と同じリダイレクトURI
client_id クライアント識別子
code_verifier PKCE向けのランダム文字列

9. トークンレスポンス

トークンレスポンスには下記パラメータを含める必要があります:

パラメータ 説明
access_token アクセストークン
token_type Bearer固定
refresh_token リフレッシュトークン
expires_in 有効期限
id_token IDトークン(nonceを含む)
  • アクセストークンはAPIアクセスに用いられます。
  • IDトークンは認証に用いられます。

10. トークン検証

RPはIDトークンの内容(iss, aud, exp, nonce等)を検証する必要があります。

11. ログインセッション

トークン検証が完了すると、業務コンテンツがユーザに返却されます。