第 4 章 クラウドサービス事業者向け実装ガイド
4.1. OpenID Connect RP (クライアント)の実装
4.1.5. ID トークンの検証
POST /catch_response HTTP/1.1 Host: www.svc.example.net
Content-Type: application/x-www-form-urlencoded
error=access_denied&error_description=User%20authentication%20failed.&state=k4y97kl szxi
認証結果を受け取ると、最初に state 値が認証要求時に指定した値と同一であるかどうかを検 証する。
state 値が一致しない場合は、受け取ったレスポンス(エラーコードとエラーの詳細)は信頼
することができない。
認証失敗の応答を受け取った場合は、state 値の検証結果にかかわらず認証エラーとし、ユー ザーを適切なページへ誘導する必要がある。適切なページとは、エラーメッセージを表示する ページのことを指す。
{
"alg": "RS256", "kid": "iAw5"
}
2 番目のパートは、ID トークンのクレームとなっている。少なくとも [3.4.1 節] に示したク レームが含まれている。
ID トークンのクレームの例を以下に示す。通常の認証要求の場合、auth_time は含まれない。
(含まれていても良い)
{
"iss": "https://op.com.example.co.jp", "sub": "e1234567",
"aud": "pWBoRam9sG", "nonce": "q8k-upBX4Z_A", "exp": 1435709162, "iat": 1435708862 }
IDトークンの検証として、最低限、次の事項を検証する。
1. iss クレームが、認証要求を送った利用企業の認証サーバーの URL と一致することを検 証する。
2. audクレームが、自クラウドサービスに割り当てられた client_idであることを検証する。
もしaudクレームが複数の値を持つ場合は、OpenID Connect Core 1.0 [OpenID.Core]
のSection 3.1.3.7の定義に従った追加の検証が必要である。
3. IDトークンの署名を、RS256アルゴリズムを用いて検証する。
IDトークンのbase64urlエンコーディングされた1番目、2番目のパートを '.' で連結し た文字列を、ハッシュ関数に SHA-256 を使うように構成された RSASSA-PKCS1-v1_5 署名検証器にかけることで検証を行なう。
具体的な手順はJWS [RFC7515] のSection 5.2, Section A.2 などに示されている。署名 検証に用いる公開鍵の取得方法は [4.1.9節] に示す。
もし、ID トークンに RS256 以外の署名アルゴリズムが指定されており、その署名をク ラウドサービスが検証可能な場合は、その検証で代替しても良い。
4. 現在時刻がexpクレームで指定された時刻よりも前であることを検証する。
5. nonce クレームが、クライアント(ブラウザ)セッションと紐付いた nonce 値と一致す
ることを検証する。
6. logout_onlyクレームが含まれていないことを検証する。
ID トークンの検証に失敗した場合は認証エラーとし、ユーザーを適切なページへ誘導する必 要がある。適切なページとは、エラーメッセージを表示するページのことを指す。
ID トークンの検証に成功した場合は、認証されたユーザーとクラウドサービスのユーザーと の紐付けに進む。
4.1.5.2. 再認証要求の場合の ID トークンの検証
再認証要求を行なった場合には、IDトークンのクレームにauth_timeが必ず含まれる。
{
"iss": "https://op.com.example.co.jp", "sub": "e1234567",
"aud": "pWBoRam9sG", "nonce": "q8k-upBX4Z_A", "exp": 1435710062, "iat": 1435709762, "auth_time": 1435709762 }
再認証要求を行なった場合の ID トークンの検証では、別ユーザーでの再認証の突破や代替の ID トークンの挿入による再認証回避を防止するため、[4.1.5.1 節] に示した ID トークンの検証 事項に加え、次の事項を検証する。
1. iss クレームと sub クレームの値がそれぞれ、現在サービスを使用しているユーザーの
「ID ト ー ク ン の Issuer」(idTokenClaims.issuer) と 「ID ト ー ク ン の Subject」 (idTokenClaims.subject) の値と一致していることを検証する。
2. auth_timeクレームの値が、妥当な範囲で現在時刻に近いことを検証する。
ID トークンの検証に失敗した場合は認証エラーとし、ユーザーを適切なページへ誘導する必 要がある。適切なページとは、エラーメッセージを表示するページのことを指す。
ユーザーの操作性を考慮すると、ID トークンの検証に失敗した場合でも再認証要求前のセッ ション状態を維持し、再認証を必要とする処理へのリトライができるようにサービスを実装する ことが必要である。
ID トークンの検証に成功した場合は再認証が成功したものとみなし、ユーザーが要求した処 理を実行する。