「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>OpenID Connect]]

* 目次 [#g1c7a054]
#contents

*概要 [#c6141615]
Finalを参照して記述。

-OpenID Connect で [[OAuth]] 2.0 を拡張した主要な~
クレーム([[クレームセット>#h586dfab]])を格納するアサーション

-仕様全体を通してメッセージ形式に[[JWT]](アサーション)を採用。
--メッセージ形式:[[JWT]](JSON Web Tokenの略)
--[[クレーム暗号化:JWT の JWS or JWE を使用する。>OpenID Connect - 暗号関連]]

-以下のクレームの値を含む[[クレームセット>#h586dfab]]。
--発行元のIdp(OP)識別子
--発行先のRP識別子(client_id)
--ユーザー識別子
--発行日時

-クレームの扱いについて[[外部クレーム>#jb63c82f]]機能を定義している。
--集約クレーム
--分散クレーム

*詳細 [#p9cc4884]

**クレームセット [#h586dfab]

***必須クレーム群 [#ffe4c45b]
-iss (issuer) クレーム
--([[OAuth]] 2.0で言う所の)Authorization Serverの識別子。
--URI形式が推奨~
これは、[[OpenID Connect Discovery 1.0>OpenID Connect - Discovery]]仕様をサポートするのであれば、~
「{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>OpenID Connect - 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]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS