はじめての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. ログインセッション
トークン検証が完了すると、業務コンテンツがユーザに返却されます。