- Open ID Connect IDトークン検証方法についてメモする。
IDトークンとは
- ユーザー認証情報を含んだ改竄検知用の署名付きトークンを指す。
- JWT(JSON Web Token)形式でエンコードして表現される。
-
ピリオド(".")区切りのHeader部、Payload部、Signature部から構成される。
-
各部位はBase64URLエンコードされる。
-
署名生成には、RSA-SHA256などが用いられる。
-
ユーザー認証の結果、発行される。
-
- JWT(JSON Web Token)形式でエンコードして表現される。
IDトークン検証方法
- クライアントは、以下の処理を行うことで、IDトークンの正当性を検証する必要がある。
- 検証に失敗した場合、認証処理を中断し、エラー処理などを行う。
1. Base64デコード
- 取得したIDトークンをBase64デコードする。
2. IDトークンをヘッダー部、ペイロード部、署名部へ"."で分割
3. トークンの復号
- (暗号化されている場合、)OpenID Providerにクライアント登録した際に、利用した鍵とアルゴリズム情報を使用して、復号する。
4. JWT 署名検証
-
alg
(署名アルゴリズム)ヘッダーパラメータを使用して、署名を検証する。- 検証には、issuerが発行した公開鍵を利用する。
- 公開鍵の取得方法は、Header部に含まれる
kid
値を用いて、issuerが提供するエンドポイントからから対になるものを取得するパターンがある。
- 公開鍵の取得方法は、Header部に含まれる
-
HS256
、HS512
のような MAC ベースのアルゴリズムを利用する場合、aud
(audience) Claim に含まれるclient_id
に対応するclient_secret
を署名の検証に利用する。
- 検証には、issuerが発行した公開鍵を利用する。
5.Issuer Identifier(ISS)クレーム検証
-
iss
がOpenID Provider(issuer)と一致するかを確認する。-
iss
- IDトークン発行者 (issuer) を識別するための識別子。
-
https://
で始まる URL (クエリー部とフラグメント部は含まない)。
https://example.com
-
6.audience(aud)クレーム 検証
-
aud
と自身に発行されたクライアントID(client_id
)が一致するかを確認する。 -
aud
- 誰を対象として発行されたのかを示す識別子。
- ID トークン発行をリクエストしたアプリケーションのクライアント ID 。
7. expiration time(exp)クレーム 検証
-
exp
クレームが現在時刻より未来であることを確認する。 -
exp
- IDトークン の有効期限。
- Unix エポック からの経過秒数で表現する。
8. nonceクレーム 検証
- (認証リクエストに
nonce
が付与されている場合、)nonce
クレームの値と認証リクエスト時に指定した値が一致することを確認する。 -
nonce
- 主にリプレイアタック防止目的の文字列。
- issuerは認証リクエストに付与された値をそのままクレームに埋め込む。
9. Authentication Context Class Reference(acr) クレーム 検証
-
acr
クレームの値とクライアント側で定義された認証コンテキストの値が一致することを確認する。 -
acr
- ユーザー認証が満たした認証コンテキスト(パスワード認証した、などどのように認証したかを示す情報)。
10. auth_timeクレーム 検証
-
auth_time
クレームが最新のユーザー認証時刻から指定時間以上経過していないことを確認する。 -
auth_time
- ユーザーが認証された時刻。