End-User の認証を可能にするために OpenID Connect が OAuth 2.0 に追加する最大の拡張機能は ID トークンデータ構造である。
ID Token は, ある Client を利用するというコンテキスト中での, Authorization Server による End-User 認証に関する Claim を含んだセキュリティトークンである。
潜在的にはその他の Claim を含む可能性もある。
ID Token は JWTである。
OpenID Connect で使用されている全ての OAuth 2.0 のフローで ID Token が利用される。
またID Tokenには以下のクレームが含まれる。
iss(必須)認可サーバの識別子
レスポンスを返したIssuerのIssure Identifier。
iss 値は, https スキーマで始まる大文字小文字を区別する URL であり, スキーマ, ホスト, そして任意でポート番号とパスを含む. クエリーとフラグメントは含まない。
sub(必須)ユーザの識別子
Subject Identifier. Client に利用される前提で, Issuer のローカルでユニークであり再利用されない End-User の識別子. (例: 24400320 や AItOawmwtWwcT0k51BayewNvutrJUqsvl6qs7A4 等) この値は ASCII で255文字を超えてはならない (MUST NOT). sub 値は大文字小文字を区別する.
aud(必須)RPの識別子
ID Token の想定されるオーディエンス (Audience). この値は Relying Party の OAuth 2.0 client_id を含まなければならない (MUST). 他のオーディエンスの識別子を含んでもよい (MAY). 一般的には aud は大文字小文字を区別した文字列の配列であるが, オーディエンスが単体の場合は aud 値を大文字小文字を区別した単一文字列としてもよい (MAY).
exp(必須)ID Tokenの有効期限
この有効期限以降に該当 ID Token を受け入れたり処理してはならない (MUST NOT). ある ID Token が有効期限内であるためには, この値が示す時刻より現在時刻が前でなければならない (MUST). 実装者は, 通常数分以内で, 時計のズレを考慮して多少の猶予期間を設けてもよい (MAY). この値は UTC 1970-01-01T0:0:0Z から該当時刻までの秒数を示す JSON 数値である. 詳細は RFC 3339 [RFC3339] を参照のこと.
iat(必須)レスポンスの発行時刻
この値は UTC 1970-01-01T0:0:0Z から該当時刻までの秒数を示す JSON 数値である。
auth_time認証した時刻(max_ageがリクエストにある場合必須それ以外の場合には任意となる)
End-User の認証が発生した時刻. この値は UTC 1970-01-01T0:0:0Z から該当時刻までの秒数を示す JSON 数値である. リクエストに max_age が含まれていた場合, この Claim は必須である (REQUIRED). その他の場合は任意 (OPTIONAL). (auth_time Claim は, OpenID 2.0 PAPE [OpenID.PAPE] auth_time レスポンスパラメーターに相当する)
acr(任意)
End-User の認証が発生した時刻. この値は UTC 1970-01-01T0:0:0Z から該当時刻までの秒数を示す JSON 数値である. リクエストに max_age が含まれていた場合, この Claim は必須である (REQUIRED). その他の場合は任意 (OPTIONAL). (auth_time Claim は, OpenID 2.0 PAPE [OpenID.PAPE] auth_time レスポンスパラメーターに相当する)
amr(任意)エンドユーザが認証に使用した方法(パスワード、ワンタイムパスとか)
Authentication Methods References. 認証時に用いられた認証方式を示す識別子文字列の JSON 配列. 例として, パスワードと OTP 認証が両方行われたことを示すといったケースが考えられる. amr Claim にどのような値を用いるかは本仕様の定めるところではない. この値の意味するところはコンテキストによって異なる可能性があるため, この Claim を利用する場合は, 関係者間で値の意味するところについて合意しておくこと. amr は大文字小文字を区別する文字列である.
azp(任意)認可の依頼者と認可されるアプリケーションが違う場合に使う(このような時はあまりないと思われる)
(例えばabcd.comからログインボタンを押し認証後に1234.comにリダイレクトされるような場合?)
ID Token 発行対象である認可された関係者 (authorized party). この Claim が存在する場合, その値は受け取り手の OAuth 2.0 Client ID でなければならない. この Claim は, ID Token のオーディエンス値が単一文字列であり, かつその値が azp の値と異なる場合にのみ必要となる. オーディエンスと azp 値が同値である場合にも, この Claim を含んでもよい (MAY). azp は大文字小文字を区別する文字列である.
使用されるクレームは以上である。
ID Token はその他の Claim を含んでもよい (MAY). 解釈不可能な Claim は全て無視すること。
ID Token は JWS [JWS] を使って署名されなければならない。
任意で JWS [JWS] によって署名し, JWE [JWE] によって暗号化することもできる。
ID Token を暗号化する場合は, 署名を行った後に暗号化しなければならない。
ID Token には, alg として none を用いてはならない
ID トークンは JWS あるいは JWE の x5u, x5c, jku と jwk ヘッダーパラメーターフィールド を使用すべきではない (SHOULD NOT). 代わりに, 使用される鍵への参照を Discovery と Registration parameters を用いて事前に伝えること。
まとめ
ID Token は, ユーザがサードパーティのアプリを使用するのに使う、認可サーバによる認証に関するクレームを含んだセキュリティトークンである。
細かいルールは他にもあるが「いくつかのクレームがあること」、「JWTを使用し署名、暗号化をするにはいくつかの決まりがあること」の2つだけを知っとけば後で詳細については調べれば良いと思われる。