Skip to content

はじめてのOpenID Connect

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

登場人物

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

シーケンス図

処理解説

1. 業務API呼び出し

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

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

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

3. 認証リクエスト

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

パラメータ説明
scopeopenid必須、他スコープ追加可能
response_type認可コードフローの場合はcode固定
client_idクライアントを識別するID
redirect_uri認証完了後にリダイレクトするURI
state認可コード保護向けのランダム文字列
code_challengecode_verifierをハッシュ化した値
code_challenge_methodS256固定
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_typeauthorization_code固定
code認可コード
redirect_uri認可コード付与時と同じリダイレクトURI
client_idクライアント識別子
code_verifierPKCE向けのランダム文字列

9. トークンレスポンス

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

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

10. トークン検証

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

11. ログインセッション

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