「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>OpenID Connect]] * 目次 [#g1c7a054] #contents *概要 [#c6141615] -OpenID Connect で [[OAuth]] 2.0 を拡張した主要な~ クレーム([[クレームセット>#h586dfab]])を格納するアサーション -仕様全体を通してメッセージ形式に[[JWT]](アサーション)を採用。 --メッセージ形式:[[JWT]](JSON Web Tokenの略) --クレーム暗号化:[[JWT]]の JWS or JWE を使用する。 -以下のクレームの値を含む[[クレームセット>#h586dfab]]。 --発行元のIdp(OP)識別子 --発行先のRP識別子(client_id) --ユーザー識別子 --発行日時 -クレームの扱いについて[[外部クレーム>#jb63c82f]]機能を定義している。 --集約クレーム --分散クレーム *詳細 [#p9cc4884] **クレームセット [#h586dfab] ***必須クレーム群 [#ffe4c45b] -iss (issuer) クレーム --([[OAuth]] 2.0で言う所の)Authorization Serverの識別子。 --URI形式が推奨 これは、OpenID Connect Discovery 1.0 仕様をサポートするのであれば、~ 「{issクレームの値}/.well-known/openid-configuration」という URL で~ リクエストを受け付ける必要があるため。 -sub (subject) クレーム~ ユーザーテーブルのプライマリーキーやそれに準ずるもの。 -aud (audience) クレーム --client_idの値を含む。 --複数要素の配列を含んでも良い (MAY) -exp (expiration time) クレーム --[[JWT]] の有効期限 --Unix エポックからの経過秒数(ミリ秒ではなく秒) -iat (issued at)クレーム --[[JWT]] の発行日時 --Unix エポックからの経過秒数(ミリ秒ではなく秒) ***ケースバイケースなクレーム群 [#d9a64ea2] -auth_time クレーム --ユーザー認証時刻 --Unix エポックからの経過秒数(ミリ秒ではなく秒) --リクエスト・パラメタやメタ情報設定次第で必須となるもよう。 -[[nonce>https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%B3%E3%82%B9]] クレーム --リプレイアタック防止を目的とするクレーム。 --ID トークン発行依頼に付属するnonce 値を、そのまま埋め込む。 --[[Implicit Flow>OpenID Connect#e7adf5c2]]、[[Hybrid Flow>OpenID Connect#l565139a]]の場合は必須となるもよう。 ***オプションのクレーム群 [#l52144f8] -acr クレーム~ [[認証コンテキスト>OpenID Connect#ja81c8fa]]のクラス -amr クレーム~ 認証手法を示す。クレームの利用者が規則を決めて運用する。 -azp クレーム --特に、aud が複数要素の配列の場合、azp で認可された対象者を明示する。 --認証されたユーザと認可されたユーザが違うケースを想定している模様。 ***Hashクレーム [#c007540d] -Authorization Endpoint からIDトークンを返す場合、必要になる。 --[[Implicit Flow>OpenID Connect#e7adf5c2]] --[[Hybrid Flow>OpenID Connect#l565139a]] -Hashクレームの種類 --at_hash: Access Token のハッシュ値 ---Access Tokenを合わせて返す場合に追加可能になる。 ---response_typeにid_tokenとtokenが含まれる時に必須、ソレ以外の場合は任意。 ---ID Token の JOSE Header にある alg Header Parameterのアルゴリズムで使用されるハッシュアルゴリズムを用い、~ Access Token のASCII オクテット列からハッシュ値を求め、左半分を base64url エンコードした値。 --c_hash: Code のハッシュ値 ---Codeを合わせて返す場合に追加可能になる。 ---response_typeにcodeとid_tokenが含まれる時に必須だが、ソレ以外の場合は任意。 ---ID Token の JOSE Header にある alg Header Parameterのアルゴリズムで使用されるハッシュアルゴリズムを用い、~ Code のASCII オクテット列からハッシュ値を求め、左半分を base64url エンコードした値。 ***[[ユーザー属性クレーム群>OpenID Connect#kb7212b1]] [#r21f1653] その他、[[ユーザー属性クレーム群>OpenID Connect#kb7212b1]]を格納する。 **外部クレーム [#jb63c82f] Idp(OP)は、扱うクレームの内容によって、 -[[集約クレーム>#yfd0840d]] -[[分散クレーム>#xaa4e17c]] どちらを利用すべきかを判断する必要がある。 ***集約クレーム(Aggregated Claims) [#yfd0840d] -別のIdp(OP)が持つクレームを署名付きで提供すること。 -RPからリクエストを受けたIdp(OP)は、事前に取得していた、~ もしくは動的に取得した別のIdp(OP)のクレームをレスポンスに含む。 一定期間変更されないことが保証されており~ キャッシュの効果があるものは集約クレーム。 ***分散クレーム(Distributed Claims) [#xaa4e17c] クレームそのものではなく、問い合わせ先のURLを扱う。 -Publicなクレームの場合 --エンドポイントのURL -ユーザー認可が必要な場合 --エンドポイントのURL --OAuth 2.0のアクセストークン をレスポンスに含む。 頻繁に更新されるものは分散クレーム。 **検証処理 [#y61f2006] Clientは、IDトークンを検証する。 ***基本的な検証処理 [#cfcb18ec] -[[JWS]]署名の検証 / [[JWE]]暗号の復号 --Client は Issuer から提供された鍵を利用しなければならない (MUST). ---[[MAC系(HS256, HS384, HS512)の場合の鍵>OpenID Connect - 暗号関連]] ---[[RSA系(HS256, HS384, HS512)の場合の鍵>OpenID Connect - 暗号関連]] --alg の値は (SHOULD) ---デフォルトの RS256 ---もしくは [[Registration>OpenID Connect#e0b59f80]] による[[id_token_signed_response_alg>OpenID Connect - Dynamic Client Registration#xc12bcf1]]パラメタ値 -issクレームの検証(Discovery で取得したIssuer値に一致)。 -audクレーム or azpクレームの検証 --audクレームに 自身の client_id が含まれることを確認する。 --audクレームが複数要素の配列の場合、azpクレームに含まれることを確認すべき。 -Time --expクレームの検証(現在時刻より後)。 --iatクレームの検証(Clientから見て古過ぎない、nonce 保存期間を制限)。 --auth_timeクレームの検証(max_ageを使用してチェックし再認証を要求)。 -OIDC --acrクレームの検証(適切かどうかをチェック、値と意味は仕様の対象外) ***フロー毎の差異 [#d74c7831] -[[Authorization Code Flow>OpenID Connect#mcde509a]] --[[JWS]]署名の検証 / [[JWE]]暗号の復号 --Token Endpoint の間の直接通信により受け取った場合、~ トークンの署名確認の代わりに TLS で issuer を確認してもよい (MAY). --OPTIONAL ---nonceクレームの検証。 ---c_hashクレームの検証(Authorization Endpoint)。 ---at_hashクレームの検証(Token Endpoint)。 -[[Implicit Flow>OpenID Connect#e7adf5c2]] --[[JWS]]署名の検証のみ([[JWE]]暗号の復号は不可) --REQUIRED ---nonceクレームの検証。 ---at_hashクレームの検証("id_token token"の場合)。 -[[Hybrid Flow>OpenID Connect#l565139a]] --nonceクレームの検証。 --Authorization Endpoint ---[[JWS]]署名の検証のみ([[JWE]]暗号の復号は不可) ---c_hashクレームの検証。 ---at_hashクレームの検証。 --Token Endpoint ---[[JWS]]署名の検証 / [[JWE]]暗号の復号 ---at_hashクレームの検証。 *例 [#m4e7fa61] **Google [#jaec1c75] GoogleでOpenID Connectの認証で取得したクレームセット。~ (id_tokenそのものなのか?、[[ユーザー情報エンドポイント>OpenID Connect#k1d9c845]]から取得したクレームか?) { "iss":"accounts.google.com", "at_hash":"・・・", ← Implicit or Hybrid Flowの追加クレーム "email_verified":"true", "sub":"ユーザーの一意識別子", "azp":"認可された対象者のID.apps.googleusercontent.com", "email":"・・・・", "aud":"クライアント識別子.apps.googleusercontent.com", "iat":JWT の発行日時(Unix時間), "exp":JWT の有効期限(Unix時間) } [[ココ>#v5e6dad3]]を見ると、これは恐らく、id_tokenなのだろうなと。 以下のGoogle公式のマニュアルにも記載があった。 -OpenID Connect | Google Identity Platform | Google Developers~ https://developers.google.com/identity/protocols/OpenIDConnect *参考 [#yce99a85] -Final: OpenID Connect Core 1.0 incorporating errata set 1~ http://openid.net/specs/openid-connect-core-1_0.html --2. ID Token~ http://openid.net/specs/openid-connect-core-1_0.html#IDToken --3.3.2.11. ID Token (Hybrid Flow)~ http://openid.net/specs/openid-connect-core-1_0.html#HybridIDToken -IDトークンが分かれば OpenID Connect が分かる - Qiita~ --[前編]~ http://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06 --[後編]~ ・・・ ---- Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]