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

-[[戻る>クレームベース認証#ya3d2a7b]]
-戻る
--[[OAuth 2.0 拡張]]
--[[OpenID / OAuth / OpenID Connect]]

* 目次 [#tc83c978]
#contents

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

-[[OpenID Connect]]の用途としては、「認証の仕様である」と言ってイイ。
-しかし技術的には、「[[ID トークン>#ofb73c59]]発行のための仕様」と考えたほうがイイ。
-しかし技術的には、「[[IDトークン>#ofb73c59]]発行のための仕様」と考えたほうがイイ。

-[[JWT]]
--この[[ID トークン>#ofb73c59]]と呼ばれる[[トークン]]は[[JWT]]アサーションを使用している。
--この[[IDトークン>#ofb73c59]]と呼ばれる[[トークン]]は[[JWT]]アサーションを使用している。~
(JSON Serializationではなく、Compact Serializationを用いる。)
--従って、[[JWT]]の生成(署名)・検証の仕組みについては、[[JWT]]を参照のこと。
--このページでは、[[OpenID Connect]]の認証用の[[JWT]]アサーションの~
トークン・プロファイル(オプション仕様)についてを説明する。

**特徴 [#n9af5768]

***モジュラーデザイン [#he3af831]
ユースケースに対応するため、
-複数の仕様から成り立っており、
-それらをモジュール的に組み合わせることで

多様な環境をサポートできる。

***プロトコル概要 [#a4aac78c]
ざっくり、リクエスト→認証・認可→ユーザ情報を取得。

 +--------+                                   +--------+
 |        |                                   |        |
 |        |---------(1) AuthN Request-------->|        |
 |        |                                   |        |
 |        |  +--------+                       |        |
 |        |  |        |                       |        |
 |        |  |  End-  |<--(2) AuthN & AuthZ-->|        |
 |        |  |  User  |                       |        |
 |   RP   |  |        |                       |   OP   |
 |        |  +--------+                       |        |
 |        |                                   |        |
 |        |<--------(3) AuthN Response--------|        |
 |        |                                   |        |
 |        |---------(4) UserInfo Request----->|        |
 |        |                                   |        |
 |        |<--------(5) UserInfo Response-----|        |
 |        |                                   |        |
 +--------+                                   +--------+
 Client(RP)                                IdP/STS(OP)

***[[OAuth]] 2.0に認証拡張 [#u9589aff]
[[OAuth]] 2.0との違いは、認証拡張機能が実装された点にある。
***[[OAuth]] 2.0への認証拡張 [#u9589aff]
[[OAuth]] 2.0との違いは、認証拡張機能が追加実装された点にある。

-[[OAuth]] 2.0では
--認証機能(「認証Endpointから[[ユーザー属性クレーム群>#kb7212b1]]を取得する」)の仕様が無かった。
--このため、この部分の拡張仕様(認証Endpoint)に方言があり、実装上問題だった。

-これに対し[[OpenID Connect]]では、
--[[ユーザー属性クレーム群>#kb7212b1]]取得のEndpointが[[ユーザー情報エンドポイント>#k1d9c845]]に標準化された。
--これによって「認可」だけでなく「認証」の仕様も標準化された。

-参考

--Idcon11 implicit demo~
http://www.slideshare.net/ritou/idcon11-implicit-demo

--matake
---OpenID Connect 101 @ OpenID TechNight vol.11~
http://www.slideshare.net/matake/technight11
---OAuth認証再考からのOpenID Connect #devlove~
http://www.slideshare.net/matake/connect-intro-dev-love

--OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜~
---OAuth 2.0 Authorization Code Flow~
http://www.slideshare.net/kura_lab/openid-connect-id/21
---OpenID Connect Authorization Code Flow~
http://www.slideshare.net/kura_lab/openid-connect-id/28

**仕様一覧 [#ie0f4645]
-Final: OpenID Connect Core 1.0 incorporating errata set 1
--http://openid.net/specs/openid-connect-core-1_0.html
--https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html
--OpenID Connectユースケース、OAuth 2.0の違い・共通点まとめ - Build Insider~
http://www.buildinsider.net/enterprise/openid/connect

***仕様の柱 [#p054dc3f]
-[[ID トークンの基本構造>#ofb73c59]]
**仕様の柱 [#p054dc3f]

-[[ID トークン>#ofb73c59]]の[[取得方法(認証のシーケンス)>#p1446f50]]]
***[[フロー>#p1446f50]] [#oa1adfa6]
[[OAuth]] 2.0に認証結果とプロフィールの受渡し機能を追加。
-[[Authorization Code Flow>#mcde509a]]
-[[Implicit Flow>#e7adf5c2]]
-[[Hybrid Flow>#l565139a]]

-[[ID トークン>#ofb73c59]]に含める[[ユーザー属性クレーム群>#kb7212b1]]
***[[IDトークン>#ofb73c59]] [#x6b0558c]
-[[基本構造>#ofb73c59]]
-[[取得方法(認証のシーケンス)>#p1446f50]]
-[[ユーザー属性クレーム群>#kb7212b1]]

***追加のエンドポイント [#ib0fba2c]
-[[ユーザー情報エンドポイント>#k1d9c845]]

***Client Implementer's Guide [#c4eeb3ab]
-[[OAuth]] 2.0に認証結果とプロフィールの受渡し機能のみを追加、
-以下は、WebアプリケーションのClientに当該フローを実装する場合の実装ガイド。
*フロー [#p1446f50]
-Final: OpenID Connect Core 1.0 incorporating errata set 1 > 3. Authentication~
http://openid.net/specs/openid-connect-core-1_0.html#Authentication

-OpenID Connect Client Implementer's Guide
--Basic Client Profile~
http://openid.net/specs/openid-connect-basic-1_0.html
>OAuth 2.0 Authorization Code Grantを拡張
**概要 [#fcc9fa97]

--Implicit Client Profile~
http://openid.net/specs/openid-connect-implicit-1_0.html
>OAuth 2.0 Implicit Grantを拡張
***フロー選択の指針 [#zcd03aad]
特定のコンテキストにおいてどのフローを選択すればよいかの指針
|#|Property|[[Authorization Code Flow>#mcde509a]]|[[Implicit Flow>#e7adf5c2]]|[[Hybrid Flow>#l565139a]]|h
|1|全てのトークンは Authorization Endpoint から返却される|no|yes|no|
|2|全てのトークンは Token Endpoint から返却される|yes|no|no|
|3|トークンが User Agent に渡らない|yes|no|no|
|4|Client 認証が可能である|yes|no|yes|
|5|Refresh Token を利用できる|yes|no|yes|
|6|通信が1往復だけである|no|yes|no|
|7|殆どの通信がサーバ間通信である|yes|no|varies|

***関連仕様 [#h5793a09]
-Discovery~
http://openid.net/specs/openid-connect-discovery-1_0.html
>メールアドレスやURLからユーザが利用しているIdp(OP)を特定する方法
***response_type 値とフローの対応 [#aff816e3]
-[[追加の応答タイプ (response_type) >#yf733ad4]]を使用する。
-どのフローを利用するかを決定する 値とフローの対応
|#|response_type値|Flow|h
|1|code|[[Authorization Code Flow>#mcde509a]]|
|2|id_token|[[Implicit Flow>#e7adf5c2]]|
|3|id_token token|[[Implicit Flow>#e7adf5c2]]|
|4|code id_token|[[Hybrid Flow>#l565139a]]|
|5|code token|[[Hybrid Flow>#l565139a]]|
|6|code id_token token|[[Hybrid Flow>#l565139a]]|

-Dynamic Client Registration~
http://openid.net/specs/openid-connect-registration-1_0.html
>(Discoveryで発見したIdp(OP)に、)動的なRP登録を行う方法
***メッセージのシリアライズ方法 [#ke1f0a07]

-Session Management~
http://openid.net/specs/openid-connect-session-1_0.html
>Idp(OP)上でユーザーがログアウトしたときにRP側から検知する方法など、セッション管理の方法
-GETリクエスト:~
application/x-www-form-urlencoded (Query String Serialization)

-[[応答タイプ (response_type)、応答モード (response_mode)>OAuth#n7f81661]]
-POSTリクエスト:~
application/x-www-form-urlencoded (Form Serialization)

*認証のシーケンス [#p1446f50]
-Final: OpenID Connect Core 1.0 incorporating errata set 1 > 3. Authentication~
http://openid.net/specs/openid-connect-core-1_0.html#Authentication
-JSON~
定義されていないが、以下で利用されるモノと思われる。

--POSTリクエスト:~
Request body

--GET, POSTレスポンス:~
Response body

--[[JWT]]化すれば以下のリクエストで使用可

---GETリクエスト:~
Query String Serialization

---POSTリクエスト:~
Form Serialization

***リクエスト・パラメタの追加・変更 [#nd004268]
-OPTIONAL ---> &color(red){REQUIRED};
--redirect_uri
--[[scope>OpenID Connect - ユーザー属性クレーム関連#k95e5b83]]~
scope="* openid *"は必須。
---OpenID Connect リクエストは scope に openid を含まねばならない (MUST).
---openid scope 値が存在しない場合の挙動は定義しない.
---他の scope 値が存在していても良い (MAY). 

-[[response_type>#aff816e3]]~
追加のパラメタ値がある。

-[[nonce>OpenID Connect - IDトークン#d9a64ea2]]
--[[Authorization Code Flow>#mcde509a]]ではOPTIONAL
--[[Implicit Flow>#e7adf5c2]]では&color(red){REQUIRED};
--[[Hybrid Flow>#l565139a]]では&color(red){REQUIRED};

-claims系

--claims (OPTIONAL)~
[[scopeパラメタの詳細版>OpenID Connect - ユーザー属性クレーム関連#lfaacf35]]

--claims_locales (OPTIONAL)~
[[クレームの多言語化対応>OpenID Connect - ユーザー属性クレーム関連#u1556f80]]

-[[Requestオブジェクト>#q19eeb33]] (OPTIONAL)

--request~
Requestオブジェクト([[JWT]])
--request_uri~
Requestオブジェクト([[JWT]])を返すエンドポイントのUrl(https)

-[[Authorization Code Flow>#mcde509a]]

--[[response_mode>OAuth 2.0 Form Post Response Mode]] (OPTIONAL)

--max_age
---最大認証期間
---[[IDトークン>#ofb73c59]]に、[[auth_timeクレーム>OpenID Connect - IDトークン#d9a64ea2]]が必要になる。

--display (OPTIONAL)~
Authorization Server は認証/認可の同意 UI を、
---page~
User Agent の全画面に表示すべき(既定値)
---popup~
User Agent のポップアップウィンドウに表示すべき.
---touch~
タッチ・インタフェースを持つデバイスに適した形で表示すべき.
---wap~
"feature phone"に適した形で表示すべき.

--prompt (OPTIONAL)~
再認証/認可の同意を要求するかどうか指定するスペース区切りの ASCII 文字列のリスト

---none~
再認証/認可の同意を要求(表示)してはならない.
---login~
再認証の同意を要求(表示)すべき.
---consent~
再認証/認可の同意を要求(表示)すべき.
---select_account~
複数アカウント前提の際に、アカウント選択を促すべき.

--hint~
基本、(素?)無視。
---id_token_hint (OPTIONAL)~
prompt=noneの時に使う
---login_hint (OPTIONAL)~
複数アカウント前提の際に、識別子のヒントとして利用する。

--その他
---ui_locales (OPTIONAL)~
UI の表示言語および文字種スペース区切りの言語タグ値のリスト
---acr_values (OPTIONAL)~
[[認証コンテキスト クラス>#ja81c8fa]]値

***レスポンス・パラメタの追加・変更 [#q4d3f512]
-Token Endpoint
--id_token~
[[response_type>#aff816e3]]で要求した場合に追加される。
--token_type~
Bearer もしくは Client が Authorization Server と交渉した他の token_type の値と規定。

***TLS要件 [#m1e4ec12]
以下との通信は、TLS を用いなければならない (MUST).
-Authorization Endpoint
-Token Endpoint

***その他の追加要件 [#dae2bcbf]
-Token Response に 以下の HTTP レスポンスヘッダーを指定(MUST).
|#|Header Name|Header Value|h
|1|Cache-Control|no-store|
|21|Pragma|no-cache|

**Authorization Code Flow [#mcde509a]
-scope="* openid *"
-[[response_type>#aff816e3]]="code"

***概要 [#t8011dab]
[[OAuth]] 2.0 からのステップ上の拡張部分は無い。~
ただし、アクセス先がResources ServerのEndpointが[[ユーザー情報エンドポイント>#k1d9c845]]に特定されており、~
ここから、認証されたユーザ情報として[[ユーザー属性クレーム群>#kb7212b1]]を取得している。
[[OAuth]] 2.0 からのステップ上の拡張部分は無い。

ただし、
-クライアントは[[IDトークン>#ofb73c59]]を使用して、[[ユーザー属性クレーム群>#kb7212b1]]を取得して検証でき、
-アクセス先がResources ServerのEndpointが[[ユーザー情報エンドポイント>#k1d9c845]]に特定されており、~
ここから、認証されたユーザとして[[ユーザー属性クレーム群>#kb7212b1]]を取得できる。

***ステップ [#a56bf502]
朱書きは、[[OAuth]] 2.0 からのステップ上の変更・拡張部分。

The Authorization Code Flow goes through the following steps.

+Client prepares an Authentication Request containing the desired request parameters.
+Client sends the request to the Authorization Server.
+Authorization Server Authenticates the End-User.
+Authorization Server obtains End-User Consent/Authorization.
+Authorization Server sends the End-User back to the Client with an Authorization Code.
+Client requests a response using the Authorization Code at the Token Endpoint.
+Client receives a response that contains an ID Token and Access Token in the response body.
+Client validates the ID token and retrieves the End-User's Subject Identifier.
+Client receives a response that contains an &color(red){ID Token and}; Access Token in the response body.
+&color(red){Client validates the ID token and retrieves the End-User's Subject Identifier.};

-[[以下で説明しているシーケンス>#h438d001]]

**Implicit Flow [#e7adf5c2]
-scope="* openid *"

-[[response_type>#aff816e3]]=
--"id_token"
--"id_token token"

***概要 [#aaa498b8]
朱書きは、[[OAuth]] 2.0 からのステップ上の変更・拡張部分。~
ポイントは、User-Agentやスマホネイティブから直接的にAccess Tokenを使用せず、~
ClientにAccess Tokenを送って、そこから[[ユーザー属性クレーム群>#kb7212b1]]を取得している点。
-クライアント(User-Agentやスマホネイティブ)は、~
[[IDトークン>#ofb73c59]]を使用して、[[ユーザー属性クレーム群>#kb7212b1]]を取得して検証でき、
-標準化された[[ユーザー情報エンドポイント>#k1d9c845]]などから、~
認証されたユーザとして[[ユーザー属性クレーム群>#kb7212b1]]を取得できる。

***ステップ [#j537479c]
朱書きは、[[OAuth]] 2.0 からのステップ上の変更・拡張部分。

The Implicit Flow follows the following steps:

+Client prepares an Authentication Request containing the desired request parameters.
+Client sends the request to the Authorization Server.
+Authorization Server Authenticates the End-User.
+Authorization Server obtains End-User Consent/Authorization.
+Authorization Server sends the End-User back to the Client with an ID Token and, if requested, an Access Token.
+Authorization Server sends the End-User back to the Client with an &color(red){ID Token and, if requested, an}; Access Token.
+&color(red){Client validates the ID token and retrieves the End-User's Subject Identifier.};

-[[以下で説明しているシーケンス>#v2c717b3]]

***ポイント [#wbd35b35]
-[[IDトークン>OpenID Connect - IDトークン]]クレームの追加要件~
Authorization Endpoint から返される[[IDトークン>OpenID Connect - IDトークン]]に対して以下が必要になる。
--[[nonce>OpenID Connect - IDトークン#d9a64ea2]]
--[[at_hash>OpenID Connect - IDトークン#c007540d]]("id_token token"の場合)

**Hybrid Flow [#l565139a]
-scope="* openid *"~
[["code token"の場合も必要!>http://openid.net/specs/openid-connect-core-1_0.html#code-tokenExample]]

-[[response_type>#aff816e3]]=
--"code token"
--"code id_token"
--"code id_token token"

***概要 [#a3306ca0]
朱書きは、[[Authorization Code Flow>#mcde509a]]との差異。~
[[IDトークン>#ofb73c59]]と同時に、アクセストークンや認可コードが一緒に発行される。~

[[ID トークン>#ofb73c59]]と同時に、アクセストークンや認可コードが一緒に発行される場合、~
[[ID トークン>#ofb73c59]]にat_hash、c_hashクレームが追加される(用途不明)。
-Hybrid な Flowであるため、
--前段が、[[Authorization Code Flow>#mcde509a]]、
--中段が、[[Implicit Flow>#e7adf5c2]]に近いフローになる。~
--後段は、Hybrid Flowの独自のフローになる。

-前段・中段・後段
--前段:[[Authorization Code Flow>#mcde509a]]~
スターターから、認可エンドポイントへのリクエストまで。

--中段:[[Implicit Flow>#e7adf5c2]]~
認可エンドポイントからRedirectエンドポイントへ、~
Implicitなフラグメント部を使用したリダイレクトをするまで。

--後段:Hybrid Flow~
UserAgent側でフラグメント部のcode, id_token, tokenを取得、

---id_tokenはUserAgentで利用する。~
[[IDトークン>#ofb73c59]]を使用して、[[ユーザー属性クレーム群>#kb7212b1]]を取得して検証できる。

---tokenはUserAgentで利用する。~
[[ユーザー情報エンドポイント>#k1d9c845]]などから、~
認証されたユーザとして[[ユーザー属性クレーム群>#kb7212b1]]などを取得できる。

---codeをClientで利用する。~
その後、UserAgentがClientにcodeを送付し、~
Client側でcodeを使用してアクセストークン・リクエストを行う。

-参考
--[[OAuth 2.0 Multiple Response Type Encoding Practices]]
--Yahoo! ID連携:Hybridフロー - Yahoo!デベロッパーネットワーク~
https://developer.yahoo.co.jp/yconnect/v2/hybrid/

***ステップ [#q42c3018]
朱書きは、[[Authorization Code Flow>#mcde509a]]との差異。

The Hybrid Flow follows the following steps:

+Client prepares an Authentication Request containing the desired request parameters.
+Client sends the request to the Authorization Server.
+Authorization Server Authenticates the End-User.
+Authorization Server obtains End-User Consent/Authorization.
+Authorization Server sends the End-User back to the Client with an Authorization Code and,~
&color(red){depending on the Response Type, one or more additional parameters.};
+Client requests a response using the Authorization Code at the Token Endpoint.
+Client receives a response that contains an ID Token and Access Token in the response body.
+Client validates the ID Token and retrieves the End-User's Subject Identifier.

*IDトークン [#ofb73c59]
-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
***ポイント [#x6b33770]
-codeをUserAgentからClientに渡す方法~
定義されていないが、クライアント側・サーバ側の違いはあるが、~
双方ともClientなので、恐らく、POSTなどでcodeをUserAgentからClientに渡せば良さそう。

**概要 [#fe1155a7]
-OpenID Connect で [[OAuth]] 2.0 を拡張した主要なクレームが、[[ID トークン>#ofb73c59]]。
-codeとtokenのaccess_tokenの差異~
セキュリティ特性によって以下が異なって良いと定義されている。
--scope
--expires_in

-以下のクレームの値を含むクレームセット。
-[[IDトークン>OpenID Connect - IDトークン]]クレームの追加要件
--Authorization Endpoint から返される[[IDトークン>OpenID Connect - IDトークン]]に対して以下が必要になる。
---[[nonce>OpenID Connect - IDトークン#d9a64ea2]]
---[[at_hash>OpenID Connect - IDトークン#c007540d]]
---[[c_hash>OpenID Connect - IDトークン#c007540d]]

--発行元のIdp(OP)識別子
--発行先のRP識別子(client_id)
--ユーザー識別子
--発行日時
--Authorization Endpoint と Token Endpoint から返される[[IDトークン>OpenID Connect - IDトークン]]のクレームについて以下が必要になる。

-仕様全体を通してメッセージ形式にJSONを採用。
---issクレームと subクレームは同一でなければならない (MUST).

-クレームの扱いについて次のような機能を定義している。
---両方に同じ Authentication イベントに関する Claim を含めるべき(SHOULD).

--[[外部クレーム>#jb63c82f]]の提供
---集約クレーム
---分散クレーム
---End-User に関するクレームは、~
Authorization Endpoint ≦ Token Endpointから返すクレームとしてよい (MAY).~
ただし、クレームが両方に存在する場合, その値は同値であるべき (SHOULD).

--クレームの暗号化(Encrypted Claims)
*主要な仕様 [#kafe9228]

**[[ID トークン>#ofb73c59]]は [[JWT]] の一種 [#k7a01d90]
***メッセージ形式にJSONを採用 [#ldcbc3dc]
[[JWT]] : JSON Web Tokenの略
**subクレームの種類 [#cf801b20]
(Subject Identifier Types)

***クレーム暗号化 [#vfd3c786]
[[JWT]]のJWS or JWEを使用する。
-「5.7.  Claim Stability and Uniqueness」で言われているように、~
--通常、subクレーム値は、iss内で一意
--故に、エンドユーザにとっては、iss+subで一意

**クレームセット [#h586dfab]
-故に、「8. Subject Identifier Types」では、
--pairwiseというオプションで、
--Client毎にsubクレーム値を変えることにより、
--Clientを跨った名寄せを困難にしてプライバシーを保護する。

***必須クレーム群 [#ffe4c45b]
-iss (issuer) クレーム
--([[OAuth]] 2.0で言う所の)Authorization Serverの識別子。
--URI形式が推奨
これは、OpenID Connect Discovery 1.0 仕様をサポートするのであれば、~
「{issクレームの値}/.well-known/openid-configuration」という URL で~
リクエストを受け付ける必要があるため。
***種類 [#b1467737]
-public~
全ての Client に対し同一の subクレーム値を提供する(既定値)

-sub (subject) クレーム~
ユーザーテーブルのプライマリーキーやそれに準ずるもの。
-pairwise~
各々の Client に対し異なる subクレーム値を提供する。

-aud (audience) クレーム~
([[OAuth]] 2.0で言う所の)クライアント識別子。
***サポート [#y1136a79]
-[[Discovery: subject_types_supported>OpenID Connect - Discovery#t527fffb]]
-[[Registration:>OpenID Connect - Dynamic Client Registration#e9256189]]
--subject_type
--sector_identifier_uri (任意)

-exp (expiration time) クレーム
--JWT の有効期限
--Unix エポックからの経過秒数(ミリ秒ではなく秒)
***pairwiseの値 [#m3999d6f]
pairwiseのsubクレーム値

-iat (issued at)クレーム
--JWT の発行日時
--Unix エポックからの経過秒数(ミリ秒ではなく秒)
-要件
--subクレーム値が, OP(IdP/STS) 以外の Party にとって, 可逆であってはならない (MUST NOT).
--異なる Sector Identifier 値は, 異なる Subject Identifier 値にならなければならない (MUST).
--同じ入力に対して必ず同じsubクレーム値となる決定的アルゴリズムでなければならない (MUST).

***ケースバイケースなクレーム群 [#d9a64ea2]
-計算例
--sub = SHA-256 ( sector_identifier || local_account_id || salt )
--sub = AES-128 ( sector_identifier || local_account_id || salt )
--GUID = ローカルアカウントID, Sector Identifier(変換テーブル)

-auth_time クレーム
--ユーザー認証時刻
--Unix エポックからの経過秒数(ミリ秒ではなく秒)
--リクエストパラメータやメタ情報設定次第で必須となるもよう。
-注釈
--sector_identifier : redirect_uri のホスト部を使用してもイイ
--salt : IdPによって秘密にされている値

-[[nonce>https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%B3%E3%82%B9]] クレーム
--リプレイアタック防止を目的とするクレーム。
--[[ID トークン>#ofb73c59]]発行依頼に付属するnonce 値を、そのまま埋め込む。
--Implicit Flowの場合は必須となるもよう。
**[[IDトークン>OpenID Connect - IDトークン]] [#ofb73c59]

***オプションのクレーム群 [#l52144f8]
**[[暗号関連>OpenID Connect - 暗号関連]] [#h9b10c6c]

-acr クレーム
--認証コンテキストのクラス
--必要に応じて再認証を催す。
--仕様で幾つか定義されているらしいが詳細不明。
**ユーザー属性 [#j46ce3c0]

-amr クレーム
--認証手法を示す。
--利用用途が不明。
--仕様範囲外、クレームの利用者が規則を決めて運用する。
***[[ユーザー属性クレーム群>OpenID Connect - ユーザー属性クレーム関連]] [#kb7212b1]

-azp クレーム
--認可された対象者
--認証されたユーザと認可されたユーザが違うケースを想定している模様。
***[[ユーザー情報エンドポイント>OpenID Connect - ユーザー属性クレーム関連#k1d9c845]] [#k1d9c845]

**外部クレーム [#jb63c82f]
Idp(OP)は、扱うクレームの内容によって、
-[[集約クレーム>#yfd0840d]]
-[[分散クレーム>#xaa4e17c]]
*その他の仕様 [#b6185413]

どちらを利用すべきかを判断する必要がある。
**追加の仕様 [#xce3cadb]
追加された仕様についてまとめる。

***集約クレーム(Aggregated Claims) [#yfd0840d]
-別のIdp(OP)が持つクレームを署名付きで提供すること。
***追加の[[応答タイプ (response_type)>OAuth 2.0 Multiple Response Type Encoding Practices]] [#yf733ad4]

-RPからリクエストを受けたIdp(OP)は、事前に取得していた、~
もしくは動的に取得した別のIdp(OP)のクレームをレスポンスに含む。
***追加の[[応答モード (response_mode)>OAuth 2.0 Form Post Response Mode]] [#h5f19339]

一定期間変更されないことが保証されており~
キャッシュの効果があるものは集約クレーム。
**オプションの仕様 [#rc15ce54]

***分散クレーム(Distributed Claims) [#xaa4e17c]
クレームそのものではなく、問い合わせ先のURLを扱う。
***[[認証コンテキスト クラス>OpenID Connect - Authentication Context Class Reference]] [#ja81c8fa]

-Publicなクレームの場合
--エンドポイントのURL
***[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]] [#q19eeb33]

-ユーザー認可が必要な場合
--エンドポイントのURL
--OAuth 2.0のアクセストークン
***[[クライアント認証>OpenID Connect - クライアント認証]] [#y7bdab62]

をレスポンスに含む。
***[[Self-Issued OP>OpenID Connect - Self-Issued OP]] [#qc1295b1]

頻繁に更新されるものは分散クレーム。
***[[CIBA Flow>CIBA(Client Initiated Backchannel Authentication)]] [#nd062205]

**例 [#m4e7fa61]
***Google [#jaec1c75]
GoogleでOpenID Connectの認証で取得したクレームセット。~
(id_tokenそのものなのか?、[[ユーザー情報エンドポイント>#k1d9c845]]から取得したクレームか?)
***[[Identity Assurance>OpenID Connect for Identity Assurance]] [#qabc9149]

 {
   "iss":"accounts.google.com",
   "at_hash":"・・・", ← Hybrid Flowの追加クレーム
   "email_verified":"true",
   "sub":"ユーザーの一意識別子",
   "azp":"認可された対象者のID.apps.googleusercontent.com",
   "email":"・・・・",
   "aud":"クライアント識別子.apps.googleusercontent.com",
   "iat":JWT の発行日時(Unix時間),
   "exp":JWT の有効期限(Unix時間)
 }
***Offline Access [#a22453e9]
offline_access scopeにより、

[[ココ>#v5e6dad3]]を見ると、これは恐らく、id_tokenなのだろうなと。
-Clientは、Resource Ownerの代わりに、長期間にわたってリソースにアクセスできる。
-このため、このパラメタは、Refresh Tokenの発行に関係する。

以下のGoogle公式のマニュアルにも記載があった。
***Session Management [#z36f893f]
-Draft: OpenID Connect Session Management 1.0 - draft 28~
http://openid.net/specs/openid-connect-session-1_0.html
--エンドユーザのログインステータスを監視する方法を定義
--IdP/STS(OP)上でユーザーがログアウトしたときにClient(RP)側から検知する方法など、セッション管理の方法
--Client(RP)が、IdP/STS(OP)からログアウトしたエンドユーザを検知してClientからもログアウトできるようにする。

-OpenID Connect | Google Identity Platform | Google Developers~
https://developers.google.com/identity/protocols/OpenIDConnect
***ログイン開始エンドポイント [#ze94647d]
アプリXのログイン・フローが、サード・パーティーの~
Client(RP)やIdP/STS(OP)によって開始される仕組み。

*ユーザー属性クレーム群 [#kb7212b1]
-Final: OpenID Connect Core 1.0 incorporating errata set 1 > 5.1.  Standard Claims~
http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims
-要するに、サード・パーティーのClient(RP)やIdP/STS(OP)から、
--リダイレクト(とは言え、GETとPOST要求を受入)で
--Client(RP)のログイン開始エンドポイントに遷移し、
--IdP/STS(OP)に認可リクエストを送信する。
--IdP/STS(OP)で認証後、Client(RP)のRedirectエンドポイントに遷移し、
--更に、その後、指定されたランディング・ページに遷移する。

**Standard Claims [#c71c8ad5]
-パラメタ

|項番|>|グループ名|意味|h
|~||クレーム名|~|h
|1|>|sub|ユーザーの一意識別子|
|2|>|profile|プロフィール|
|2-1|>|name|フルネーム|
|2-2|>|given_name|名|
|2-3|>|family_name|姓|
|2-4|>|middle_name|ミドルネーム|
|2-5|>|nickname|ニックネーム|
|2-6|>|preferred_username|好みのユーザー名|
|2-7|>|profile|プロフィールページの URL|
|2-8|>|picture|プロフィール画像の URL|
|2-9|>|website|Web サイトやブログの URL|
|2-10|>|gender|性別。female と male が定義済み。|
|2-11|>|birthdate|誕生日。YYYY-MM-DD。|
|2-12|>|zoneinfo|タイムゾーン。Europe/Paris など。|
|2-13|>|locale|ロケール。en-US など。|
|2-14|>|updated_at|情報最終更新日。Unix エポックからの経過秒数。|
|3|>|email|電子メール|
|3-1||email|電子メールアドレス|
|3-2||email_verified|電子メールアドレスが検証済みか否かの真偽値|
|4|>|phone|電話|
|4-1||phone_number|電話番号|
|4-2||phone_number_verified|電話番号が検証済みか否かの真偽値|
|5|>|address|住所 JSON object。書式は「5.1.1. Address Claim」に記載。|
|5-1||formatted|フォーマットされたフルメールアドレス、表示用・郵送用に使用|
|5-2||street_address|通り・番地、号室、私書箱、複数行の拡張された住所情報。|
|5-3||locality|City or locality|
|5-4||region|State, province, prefecture, or region.|
|5-5||postal_code|Zip code or postal code|
|5-6||country|Country name|
--iss (&color(red){REQUIRED};)~
認可リクエストを送信するIdP/STS(OP)を示す

**多言語化 [#u1556f80]
-クレームによっては多言語化可能
-クレーム名に続いて"#ja-Kana-JP"などの言語タグを付与する。
--login_hint (OPTIONAL)~
認可リクエストにlogin_hintパラメタ値として含める.

*ユーザー属性クレーム群の格納要求 [#qb26baa1]
--target_link_uri (OPTIONAL)
---Redirectエンドポイントから、指定されたランディング・ページに遷移。
---オープンリダイレクターとして使用されることを防ぐためtarget_link_uri値を検証する (MUST).

**scope値による格納要求 [#k95e5b83]
scope値によってユーザー属性クレーム群の格納要求を行うことができる。
*考慮点 [#yb6d697f]

-Final: OpenID Connect Core 1.0 incorporating errata set 1 >~
5.4. Requesting Claims using Scope Values~
http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
**IdP/STS(OP)の実装 [#ia77d57c]

***グループ名 [#xc20fc3f]
[[前述のグループ名>#c71c8ad5]]をscope値に指定可能。
***必須の実装 [#xef2ea35]
-すべてのIdP/STS(OP)

***格納部位 [#z4362392]
-UserInfoエンドポイントからUserInfoレスポンス(JSON オブジェクト)として返される.
--署名: RS256

-response_type 値が id_token の場合、
--この場合、Access Token が発行されない。
--ユーザー属性クレーム群はID Token で返却される。
--認可画面
管理機能を用いた事前の認可の同意など
---display
---prompt

**クレーム要求JSONによる格納要求 [#lfaacf35]
-クレームをリスト化したJSON オブジェクトを使用して特定のクレームの返却を要求する。
--[[ユーザー属性クレーム群>#kb7212b1]]に含まれていない Claim を要求する唯一の方法。
--scope 値では指定することが出来ない[[ユーザー属性クレーム群>#kb7212b1]]の特定の組み合わせを要求する唯一の方法。
--Locales
---ui_locales
---claims_locales

-Final: OpenID Connect Core 1.0 incorporating errata set 1 >~
5.5. Requesting Claims using the "claims" Request Parameter~
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ClaimsParameter
--認可リクエスト・パラメタへ対応
---max_age
---acr_values

***トップレベルメンバ [#va260684]
-userinfoメンバ
--OPTIONAL.
--UserInfoエンドポイントへ返却を要求する個々のクレームのリスト。
--以下のクレームの格納要求
---auth_time

--当メンバが存在した場合、
---scope 値で要求されたクレームに加え、
---当メンバでリストされたクレームも返却される。
-動的なIdP/STS(OP)

--当メンバーが存在しなかった場合、
---scope 値で要求されたクレームのみが返却される。
---userinfoメンバを指定する際は、UserInfo Endpoint を使用するために、~
response_type に対し, Access Token を Client に発行するタイプの値を指定しなければならない。
--Response Type
---id_token
---code (Self-Issued OP 以外)
---id_token token (Self-Issued OP 以外)

-id_tokenメンバ
--OPTIONAL.
--[[ID トークン>#ofb73c59]]内に格納して返却を要求する個々のクレームのリストを示す。
--UserInfo Endpoint (Self-Issued OP 以外)
--[[JWK]] 公開(jwks_uri、X.509 形式でも可)
--Requestオブジェクトのrequest_uri

--当メンバーが存在した場合、
---デフォルトのクレームに加え
---当メンバーでリストされたクレームも返却される。
--[[Discovery、Dynamic Client Registration>#h5793a09]]

--当メンバーが存在しなかった場合、
---デフォルトのクレームのみが返却される。
***Client(RP)次第の実装 [#xef2ea35]
-Confidential Client: Authoriation Code Flow
-Public Client: Implicit Flow
-[[Discovery、Dynamic Client Registration>#h5793a09]]

***クレーム要求JSONの例 [#pd68c57b]
クレーム要求JSONの例を以下に示す:
  {
   "userinfo":
    {
     "given_name": {"essential": true},
     "nickname": null,
     "email": {"essential": true},
     "email_verified": {"essential": true},
     "picture": null,
     "http://example.info/claims/groups": null
    },
   "id_token":
    {
     "auth_time": {"essential": true},
     "acr": {"values": ["urn:mace:incommon:iap:silver"] }
    }
  }
***Discovery、Dynamic Client Registration [#h5793a09]
事前登録のない Client(RP) と IdP/STS(OP) 間の~
予期しないやりとりをサポートすることを選択した場合に実装が必要。

*ユーザー情報エンドポイント [#k1d9c845]
-Final: OpenID Connect Core 1.0 incorporating errata set 1 > 5.3. UserInfo Endpoint~
http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
-[[Discovery>OpenID Connect - Discovery]]
-[[Dynamic Client Registration>OpenID Connect - Dynamic Client Registration]]

**概要 [#i3f298f2]
-OAuth 2.0のResource ServerのWebAPI
-HTTP的には、HTTPS必須
**セキュリティ [#h9f4ec8e]

***リクエスト [#y620d43e]
-HTTP の GET と POST メソッドをサポートする。
***[[OAuth 2.0 Threat Model and Security Considerations]] [#k3a85d0c]

-UserInfoリクエストの一例を示す:
 GET /userinfo HTTP/1.1
 Host: server.exampletechinfoofmicrosofttech.osscons.jp
 Authorization: Bearer ・・・・・
***サーバ認証 [#x9aefc3b]
[[ID Token>OpenID Connect - IDトークン]]の署名・暗号化で提供される。

***レスポンス [#k20c216c]
-UserInfoレスポンスは JSON オブジェクトとして返される。
--UserInfoクレームは JSON オブジェクトのメンバーとして返される。
--UserInfoレスポンスのクレームセットには、必ず sub (subject) クレームを含める。
--[[ユーザー属性クレーム群>#kb7212b1]]に加え、そこに明記されていないクレームも返却可能。
--Idp(OP)は要求された クレームの値を、必ずしも返さなくてもよい。
--クレームが返されない場合、null や空文字列ではなく、JSON オブジェクトのメンバーから除かれるべき。
***トークン [#w3cd047e]

-JWTによる署名 or 暗号化、若しくは、署名 and 暗号化を行う場合
--Claim は JWT で返されるため、Content-Type は application/jwtとする。
--署名する場合、subに加え、iss (issuer) Claim と aud (audience) Claim を含むべき。
--署名と暗号化の両方が要求された場合、レスポンスは [[JWT]] で定義されているように、~
結果はネストされた [[JWT]] となり、 署名した後に暗号化しなければならない。
-トークン生成
--[[JWT]]([[JWS])を使用する。
--TLS を使用する。

-以下に UserInfoレスポンスの一例を示す:
  HTTP/1.1 200 OK
  Content-Type: application/json
  {
    "sub": "ユーザID 的 な情報",
    "name": "Jane Doe",
    "given_name": "Jane",
    "family_name": "Doe",
    "preferred_username": "j.doe",
    "email": "janedoe@techinfoofmicrosofttech.osscons.jp",
    "picture": "http://techinfoofmicrosofttech.osscons.jp/janedoe/me.jpg"
  }
-アクセス許可の制限~
aud の scope に対して制限をかける。

-クライアントによるUserInfoレスポンスの検証
--TLS サーバー証明書チェックを通じてIdp(OP)を検証する。
--UserInfoレスポンスが[[JWT]]の場合、署名検証や復号化を行う。
--[[ID トークン>#ofb73c59]]とUserInfoクレームのsubが一致することを検証する必要がある。
-有効期限の制限~
code, access_token, refresh_token, 

**[[Discovery、Dynamic Client Registration>#h5793a09]]との関連 [#u39da1e3]
この仕様は、[[Discovery、Dynamic Client Registration>#h5793a09]]と関係がある。
-設定によって、[[ID トークン>#ofb73c59]]相当の情報が、[[JWT]] 形式もしくは [[JSON]] 形式で返される。
-設定によって、[[JWT]]の署名アルゴリズムも影響を受ける。
-置換攻撃の防止
--iss(完全一致)
--sub
--aud
--azp
--at_hash
--c_hash

*OpenID Connectのシーケンス [#s55b276e]
***暗号化 [#zbd19110]
-各実装は TLS をサポート

-共通鍵暗号~
HS256などのMACを使用する場合、client_secret は最低でも32オクテットが必要

-暗号関連の様々な攻撃
--タイミング・アタック
--[[JWT]]
---[[JWT]] の Security Considerations
---[[JWT]] が参照する, 各脆弱性を防ぐための仕様群

***Requestオブジェクト [#nf6b5630]
リクエストの漏洩や改ざんの防止
-特に、max_age と acr_valuesなどの改ざん防止。
-特に、claims や acr_valuesなどの漏洩防止

*シーケンスとサンプル [#j903f0d1]

**OpenID Connectのシーケンス [#s55b276e]
STEP 0 は事前準備なので、STEP 1 からが実際の認証・認可のシーケンス。

**Webアプリ(Basic Client Profile) [#h438d001]
-Basic Client Profile:OAuth 2.0 Authorization Code Grantを拡張
***Webアプリ(Basic Client Profile) [#h438d001]
-概要~
Basic Client Profile:OAuth 2.0 Authorization Code Grantを拡張

-デジタル・アイデンティティ技術最新動向(4):「OpenID Connect」を理解する (1/2) - @IT~
-参考
--デジタル・アイデンティティ技術最新動向(4):「OpenID Connect」を理解する (1/2) - @IT~
http://www.atmarkit.co.jp/ait/articles/1209/27/news138.html

-OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜~
--OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜~
OpenID Connect Authorization Code Flow~
http://www.slideshare.net/kura_lab/openid-connect-id/28

-OpenID Connect体験 - Qiita~
--OpenID Connect体験 - Qiita~
http://qiita.com/sonedazaurus/items/753a65186f1be7185b39

***STEP 0 : 事前準備(Idp(OP)にRPを登録) [#uc0ae497]
Idp(OP)にRPを登録し、
-STEP 0 : 事前準備(IdP/STS(OP)にClient(RP)を登録)
--IdP/STS(OP)にClient(RP)を登録し、下記を入手する。
---アプリケーションID(client_id)
---シークレット(client_secret)

-アプリケーションID(client_id)
-シークレット(client_secret)

を入手する。

-参考
--Yahoo! JAPAN IDの登録ページ~
--参考
---Yahoo! JAPAN IDの登録ページ~
https://account.edit.yahoo.co.jp/registration
--アプリケーションIDの登録ページ~
---アプリケーションIDの登録ページ~
https://e.developer.yahoo.co.jp/register

***STEP 1 : Authorization codeの取得 [#w6d2830e]
RPがIdp(OP)からAuthorization codeを取得。

-リクエスト
 https://・・・Idp(OP)のAuthorization code取得用のURL・・・?
-STEP 1 : Authorization codeの取得
--Client(RP)がIdP/STS(OP)からAuthorization codeを取得。
--スターターのリクエストをIdP/STS(OP)に送信する。
---電文
 https://・・・IdP/STS(OP)のAuthorization code取得用のURL・・・?
     response_type=code+id_token
     &client_id={client_id}
     &redirect_uri=・・・RPのURL・・・
     &redirect_uri=・・・Client(RP)のURL・・・
     &state=CSRF対策のランダム文字列
     &scope=openid+profile
     &nonce=リプレイアタック対策のランダム文字列

-パラメタ
|パラメータ|必須|説明|h
|response_type|○|「code」と「id_token」を指定|
|client_id|○|事前に準備したclient_idの値を指定|
|redirect_uri|○|アプリケーションID登録時のコールバックURLに入力したURLを指定|
|state||CSRF対策のランダム文字列を指定|
|scope|○|・openid:ユーザー識別子を取得(必須)&br;・profile:姓名・生年・性別が取得&br;・email:メールアドレスと確認済みフラグを取得&br;・address:ユーザー登録住所情報が取得|
|nonce|id_tokenを取得する際は必須|リプレイアタック対策のランダム文字列を指定|
|display||ユーザのUIを選択:&br;・page(PC用UI、デフォルト値)&br;・touch(スマートフォン用UI)&br;・wap(フィーチャーフォン用UI)&br;・inapp(ネイティブアプリ用UI)~|
|その他、Idp(OP)独自パラメタ||-|
---上記のパラメタの説明
|#|パラメタ|必須|説明|h
|1|response_type|○|「code」と「id_token」を指定|
|2|client_id|○|事前に準備したclient_idの値を指定|
|3|redirect_uri|○|アプリケーションID登録時のコールバックURLに入力したURLを指定|
|4|state||CSRF対策のランダム文字列を指定|
|5|scope|○|・openid:ユーザー識別子を取得(必須)&br;・profile:姓名・生年・性別が取得&br;・email:メールアドレスと確認済みフラグを取得&br;・address:ユーザー登録住所情報が取得|
|6|nonce|Implicit or Hybrid Flowでid_tokenを取得する際は必須|リプレイアタック対策のランダム文字列を指定|
|7|display||ユーザのUIを選択:&br;・page(PC用UI、デフォルト値)&br;・touch(スマートフォン用UI)&br;・wap(フィーチャーフォン用UI)&br;・inapp(ネイティブアプリ用UI)~|
|8|その他、IdP/STS(OP)独自パラメタ||-|

-成功するとログイン/同意画面が表示される。~
一度同意すると、次回以降同意画面は省略される。
---成功すると認証/認可の同意画面が表示される。~
一度同意すると、次回以降、認証/認可の同意画面は省略される。

-ログイン/同意が完了する(もしくは事前にログイン、同意している)と、~
以下のようなURLで「・・・RPのURL・・・」にリダイレクトされる。
 http://・・・RPのURL・・・?code=xxxxxxxx&state=CSRF対策のランダム文字列
--認証/認可の同意が完了する(もしくは事前に認証/認可の同意をしている)と、~
以下のようなURLで「・・・Client(RP)のURL・・・」にリダイレクトされる。
---電文
 http://・・・Client(RP)のURL・・・?code=xxxxxxxx&state=CSRF対策のランダム文字列
---上記のパラメタの説明
|#|パラメタ|説明|h
|1|code|”code=xxxxxxxx”を取得する。|
|2|state|”state=CSRF対策のランダム文字列”が、一致していることを確認する。|

--”code=xxxxxxxx”が、Authorization codeなので保存する。
--”state=CSRF対策のランダム文字列”が、一致していることを確認する。
-STEP 2 : Access Token、[[ID Token>OpenID Connect - IDトークン]]の取得
--Tokenを取得する際は、POSTでリクエストを送信する~
(HTTPリクエストのヘッダーやデータにTokenリクエストに必要な値を指定する必要がある)~
ため、CUIのcURLコマンドを使用して、Access Token、[[ID Token>OpenID Connect - IDトークン]]を取得する。

***STEP 2 : Access Token、ID Tokenの取得 [#ma165906]
--cURLコマンドなどでリクエストする。
---電文
|#|部分|説明|h
|1|Header|Authorization: Basic {basicAuth}|
|2|URL|https://・・・IdP/STS(OP)のAccess Token、[[ID Token>OpenID Connect - IDトークン]]取得用のURL・・・?grant_type=authorization_code&code=・・・&redirect_uri=・・・"|

-Tokenを取得する際は、POSTでリクエストを送信(HTTPリクエストのヘッダーやデータにTokenリクエストに必要な値を指定する必要がある)ため、CUIのcURLコマンドを使用して、Access Token、ID Tokenを取得する。
---上記のパラメタの説明
|#|パラメタ|必須|説明|h
|1|{basicAuth}|○|基本認証を使用したクライアント認証のため、&br;アプリケーションID(client_id)、シークレット(client_secret)を":"区切りで結合しBase64文字列化|
|2|grant_type|○|authorization_code という固定文字列を指定|
|3|code|○|Authorization codeを指定、リクエスト送信後は使用できなくなる。|
|4|redirect_uri|○|STEP 1 のredirect_uriで指定したURLを入力。|

-cURLコマンドなどでリクエストする。
--Header:'Authorization: Basic {basicAuth}'
--URL:https://・・・Idp(OP)のAccess Token、ID Token取得用のURL・・・?grant_type=authorization_code&code=・・・&redirect_uri=・・・"
--
|パラメータ|必須|説明|h
|grant_type|○|authorization_code という固定文字列を指定|
|code|○|Authorization codeを指定、リクエスト送信後は使用できなくなる。|
|redirect_uri|○|STEP 1 のredirect_uriで指定したURLを入力。|

--基本認証が必要になる。
---アプリケーションID(client_id)
---シークレット(client_secret)
---上記を":"区切りで結合しBase64文字列化

-以下の様なレスポンスが返る。
--以下の様なレスポンスが返る。
---電文
 {
     "access_token":"{ヘッダー部}.{ペイロード部}.{シグネチャー部}",
     "access_token":"・・・",
     "token_type":"bearer",
     "expires_in":"3600",
     "refresh_token":"・・・",
     "id_token":"・・・"
     "id_token":"JWT、JSWの場合、{ヘッダー部}.{ペイロード部}.{シグネチャー部}"
 }

***STEP 3 : [[ID トークン>#ofb73c59]]の正当性の検証 [#a2c91dd5]
"access_token"の

-{ヘッダー部}を取り出して、base64デコード。~
-STEP 3 : [[IDトークン>#ofb73c59]]の正当性の検証~
--"access_token"の{ヘッダー部}を取り出して、base64デコード。
---{ヘッダー部}の電文
 {
     "typ":"JWT",
     "alg":"HS256"
 }
--typ:JWT(JSON Web Token)
--alg:HMAC-SHA256(署名に使用したハッシュ)

-{ペイロード部}を取り出して、base64デコード。
---{ヘッダー部}のパラメタの説明
|#|パラメタ|説明|h
|1|typ|typ:JWT(JSON Web Token)|
|2|alg|alg:HMAC-SHA256(署名に使用したハッシュ)|

--{ペイロード部}を取り出して、base64デコード。
---{ペイロード部}の電文
 {
     "iss":"https:\/\/・・・Access Tokenの発行元URL・・・",
     "user_id":"ユーザー識別子",
     "aud":"アプリケーションID(client_id)と一致する値",
     "iat":IDトークンの発行時刻,
     "exp":IDトークンの有効期限,
     "nonce":"STEP 1 のnonceと一致する値"
 }

-署名の検証
--"{ヘッダー部}.{ペイロード部}"を使用して,alg:HMAC-SHA256でバイナリ形式でハッシュ化。
--それをBase64文字列化した文字列が"{シグネチャー部}"と一致していることを確認する。
--署名の検証
---"{ヘッダー部}.{ペイロード部}"を使用して、~
{ヘッダー部}のalg:HMAC-SHA256でバイナリ形式でハッシュ化。
---それをBase64文字列化した文字列が"{シグネチャー部}"と一致していることを確認する。

***STEP 4 : 属性情報の取得 [#v5e6dad3]
-RPがIdP(OP)で認証したユーザ属性情報を取得する。
-ここで、準備、STEP 0-3 で取得したAccess Tokenを使う。
-STEP 4 : 属性情報の取得~
Client(RP)がIdP/STS(OP)で認証したユーザ属性情報を取得する。

-[[ユーザー情報エンドポイント>#k1d9c845]]に、以下の形式でAccess Tokenを渡す。
--Header:'Authorization: Bearer {access_token}'
--URL:https://・・・ユーザ属性情報の発行元URL・・・?schema=openid

-以下のユーザ属性情報を含んだクレームが取得できる。
--[[ユーザー情報エンドポイント>#k1d9c845]]に、以下の形式でAccess Tokenを渡す。
---電文
|#|部分|説明|h
|1|Header|'Authorization: Bearer {access_token}'|
|2|URL|URL:https://・・・ユーザ属性情報の発行元URL・・・?schema=openid|

---上記のパラメタの説明~
{access_token}に、準備、STEP 0-3 で取得したAccess Tokenを使う。

--以下のユーザ属性情報を含んだクレームが取得できる。
---電文
 {
     "user_id":"・・・",
     "name":"・・・",
     "given_name":"・・・",
     "given_name#ja-Kana-JP":"・・・",
     "given_name#ja-Hani-JP":"・・・",
     "family_name":"・・・",
     "family_name#ja-Kana-JP":"・・・",
     "family_name#ja-Hani-JP":"・・・",
     "gender":"male or female",
     "birthday":"YYYY",
     "locale":"ja-JP,etc."
 }

**モバイルアプリ(Implicit Client Profile) [#v2c717b3]
-Implicit Client Profile:OAuth 2.0 Implicit Grantを拡張
***モバイルアプリ(Implicit Client Profile) [#v2c717b3]
-概要
--Implicit Client Profile:OAuth 2.0 Implicit Grantを拡張
--Webアプリ(Basic Client Profile)との違い
---STEP 0は、前提の違いによる差異。
---STEP 1以降は、[[Implicit Flow>#e7adf5c2]]がベースとなっている。

-参考
--デジタル・アイデンティティ技術最新動向(4):「OpenID Connect」を理解する (2/2) - @IT~
http://www.atmarkit.co.jp/ait/articles/1209/27/news138_2.html

-Webアプリ(Basic Client Profile)との違い
--STEP 0は、前提の違いによる差異。
--STEP 1以降は、Implicit Flowがベースとなっている。
-STEP 0 : Discovery & Dynamic Client Registration~
IdP/STS(OP)探索と動的なClient(RP)登録

***STEP 0 : Discovery & Dynamic Client Registration [#l8e54863]
IdP(OP)探索と動的なRP登録

-「○○のIDでログイン」というリンクを選択する替わりに、~
次の2種類の値をIdP(OP)特定(Discovery)のためのヒントとして利用できる。
--メールアドレス~
--IdP/STS(OP)探索~
「○○のIDでログイン」というリンクを選択する替わりに、~
次の2種類の値をIdP/STS(OP)特定(Discovery)のためのヒントとして利用できる。
---mailアドレス~
例 : ritou@openidconnect.info
--OP URL~
---IdP/STS(OP)URL~
例 : https://openidconnect.info

-動的なRP登録~
RP登録用エンドポイントにPOSTリクエストを送ることで、~
動的なRP登録(Dynamic Client Registration)もできる。
--動的なClient(RP)登録~
Client(RP)登録用エンドポイントにPOSTリクエストを送ることで、~
動的なClient(RP)登録(Dynamic Client Registration)もできる。

結果的に、OPからRP識別のための“cient_id”がレスポンスされる。
>結果的に、IdP/STS(OP)からClient(RP)識別のための“cient_id”がレスポンスされる。

***STEP 1 : Authorization Request [#q48280b8]
-STEP 1 : Authorization Request~
認可リクエスト

***STEP 2 : Authorization Response [#g13ce252]
-STEP 2 : Authorization Response~
認可応答

***STEP 3 : ID Token Verification [#b8e5b481]
[[ID トークン>#ofb73c59]]の検証
-STEP 3 : ID Token Verification~
[[IDトークン>#ofb73c59]]の検証

***STEP 4 : Accessing to UserInfo Endpoint [#c0d0225d]
-STEP 4 : Accessing to UserInfo Endpoint~
[[ユーザー情報エンドポイント>#k1d9c845]]へのアクセス

**OpenId Connectのサンプル [#l2d6ff73]

***Microsoft.Owin.Security.OpenIdConnect [#i4f26644]
AzureADに対して、OpenId Connectを使用して認証する。

https://github.com/OpenTouryoProject/SampleProgram/tree/master/ASPNET/AuthN_AuthZ/OpenID_Connect/

-サンプル・アプリケーションをAzure Active Directoryに登録
>
+Azureの管理ポータルにサインイン。
+Azure Active Directoryのタブを開く。
+サンプル・アプリケーションを登録するテナント(ドメイン)を開く。
+[Applications]タブに移動し、ページの下部の[Add]アイコンををクリック。
+[What do you want to do?]画面で[Add an application my organization is developing]を選択。
+[Tell us about your application]画面が表示される。
++アプリケーションの名前を入力(例:OpenIDConnect_sample)。
++[Web Application and / or Web API]を選択する。
++[Next]をクリックする。
+[App properties]画面が表示される。
++サンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)~
サンプル・プロジェクトのプロパティにある開発サーバのSSL URLプロパティを指定~
http://www.codeproject.com/Tips/766918/Visual-Studio-Use-HTTPS-SSL-On-Web-Application-Pro
++アプリのID URIを入力(例:https://<your_tenant_name>/OpenIDConnect_sample)~
'<your_tenant_name>はAzure ADのテナント(ドメイン)名。
++[Complete]をクリック。

-サンプル・アプリケーションの構成
>
+[[Web.config>.NET config#u3d1af27]]ファイルを開く。
+FxTenantにAzure ADのテナント(ドメイン)名を指定(例:xxxxx.onmicrosoft.com)
+FxClientId にAzureのポータルから入手することができるClient IDを指定
++クライアントIDを取得するには、
++Azureの管理ポータルにサインイン。
++Azure Active Directoryのタブを開く。
++サンプル・アプリケーションを登録したテナント(ドメイン)を開く。
++[Applications]タブに移動しサンプル・アプリケーションを選択。
++アプリケーション画面で[ACCESS WEB APIS IN OTHER APPLICATIONS]を選択。
++Client IDをコピー。
+FxPostLogoutRedirectUriにサンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)

-サンプル・アプリケーションの実行
>F5実行でリダイレクトされた先のAzure AD(IdP/STS(OP))で認証できることを確認する。

*参考 [#p95f33f1]
-超速習 OpenID Connect - Qiita~
http://qiita.com/sylph01/items/208ae313c03426feedc1

-第一回 認証基盤のこれからを支えるOpenID Connect | オブジェクトの広場~
https://www.ogis-ri.co.jp/otc/hiroba/technical/openid-connect/chap1.html

-デジタル・アイデンティティ技術最新動向(4):「OpenID Connect」を理解する - @IT
--http://www.atmarkit.co.jp/ait/articles/1209/27/news138.html
--http://www.atmarkit.co.jp/ait/articles/1209/27/news138_2.html

-[前編] IDトークンが分かれば OpenID Connect が分かる - Qiita~
http://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06

-OpenID Connectはそんなに大変かね? - OAuth.jp~
http://oauth.jp/blog/2016/02/24/is-openid-connect-far-from-oauth2/

-エンタープライズITでのOpenID Connect利用ガイドライン~
http://www.slideshare.net/tkudo/openid-connect-for-enterprise

**OpenID Foundation [#z4c28dbb]
-OpenID Connect | OpenID~
http://openid.net/connect/
--Final: OpenID Connect Core 1.0 incorporating errata set 1~
http://openid.net/specs/openid-connect-core-1_0.html
---Final: OpenID Connect Discovery 1.0 incorporating errata set 1~
https://openid.net/specs/openid-connect-discovery-1_0.html
---Final: OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1~
https://openid.net/specs/openid-connect-registration-1_0.html

-公開資料 | OpenID ファウンデーション・ジャパン~
***OpenID ファウンデーション・ジャパン [#k81b738c]
-公開資料~
http://www.openid.or.jp/document/
--OpenID Foundation Japan - 翻訳・教育 Working Group~
https://openid-foundation-japan.github.io/
---Final: OpenID Connect Core 1.0 incorporating errata set 1~
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html
---Draft: OpenID Connect Basic Client Implementer's Guide 1.0 - draft 37~
https://openid-foundation-japan.github.io/openid-connect-basic-1_0.ja.html
---Draft: OpenID Connect Implicit Client Implementer's Guide 1.0 - draft 20~
https://openid-foundation-japan.github.io/openid-connect-implicit-1_0.ja.html

-Final: OpenID Connect Core 1.0 incorporating errata set 1~
http://openid.net/specs/openid-connect-core-1_0.html
-OpenID Foundation Japan - YouTube~
https://www.youtube.com/channel/UC51IVklJgkZ7cCY8XNvjF5g

--Final: OpenID Connect Discovery 1.0 incorporating errata set 1~
https://openid.net/specs/openid-connect-discovery-1_0.html
***Client Implementer's Guide [#c4eeb3ab]
WebアプリケーションのClientに当該フローを実装する場合の実装ガイド。

--Final: OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1~
https://openid.net/specs/openid-connect-registration-1_0.html
-OpenID Connect Client Implementer's Guide
--Basic Client Profile~
http://openid.net/specs/openid-connect-basic-1_0.html
>OAuth 2.0 Authorization Code Grantを拡張

--Implicit Client Profile~
http://openid.net/specs/openid-connect-implicit-1_0.html
>OAuth 2.0 Implicit Grantを拡張

**Qiita [#k7288da4]
-超速習 OpenID Connect~
http://qiita.com/sylph01/items/208ae313c03426feedc1

***TakahikoKawasaki [#n96b57cd]
-一番分かりやすい OpenID Connect の説明~
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe

-[[IDトークンが分かれば OpenID Connect が分かる>OpenID Connect - IDトークン#yce99a85]]

**slideshare [#af3913c1]
-エンタープライズITでのOpenID Connect利用ガイドライン~
http://www.slideshare.net/tkudo/openid-connect-for-enterprise

-OpenID Connect 入門~
〜コンシューマーにおけるID連携のトレンド〜
--OAuth 2.0 Authorization Code Flow~
---http://www.slideshare.net/kura_lab/openid-connect-id/21
---~ http://www.slideshare.net/kura_lab/openid-connect-id/27
--OpenID Connect Authorization Code Flow~
---http://www.slideshare.net/kura_lab/openid-connect-id/28
---~ http://www.slideshare.net/kura_lab/openid-connect-id/78

**IdM実験室 [#l12e411e]

***WIF [#p153dc92]

-IdM実験室 WIF Extension for OAuth を使って OpenID Connect を体験~
http://idmlab.eidentity.jp/2012/03/wif-extension-for-oauth-openid-connect.html

WIF Extension for OAuthは古い?

***OWIN [#x00c009d]
Microsoft.Owin.Security.OpenIdConnect

-IdM実験室: [AAD/ASP.NET] OpenID Connectを使ってAADでログオンする~
-IdM実験室: [AAD/ASP.NET]

--OpenID Connectを使ってAADでログオンする~
http://idmlab.eidentity.jp/2014/05/aadaspnet-openid-connectaad.html
-Ad(microsoftの方)のOpenId Connect対応~
---Ad(microsoftの方)のOpenId Connect対応~
http://www.slideshare.net/naohiro.fujie/admicrosoftopen-id-connect

--(続)OpenID Connectを使ってAADでログオンする~response_mode=fragment編~
http://idmlab.eidentity.jp/2014/05/aadaspnet-openid-connectaadresponsemode.html

***ADFS [#hcd0bd22]
-IdM実験室: [AD FS]OpenID Connectに対応した次期AD FSを試す~
http://idmlab.eidentity.jp/2015/08/ad-fsopenid-connectad-fs.html

**Tsmatz [#x416a34b]
-v2.0 endpoint の OAuth を使った Client 開発 (Azure AD と MSA への対応) – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2016/02/24/v2-endpoint-oauth2-client-using-azure-active-directory-and-microsoft-account/
***OIDC素描 [#y3e8cb52]
-[LINE Login]LINE Developer Communityで~
OpenID Connect(+少しAzure AD B2C)の解説をしました~
https://idmlab.eidentity.jp/2019/03/line-loginline-developer.html
--実装して理解するLINE LoginとOpenID Connect入門~
https://www.slideshare.net/naohiro.fujie/line-loginopenid-connect
--GitHub - fujie/line_login~
https://github.com/fujie/line_login

-v2.0 endpoint の JavaScript Client 開発 (OAuth Implicit Grant Flow) – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2016/03/02/azure-ad-msa-v2-endpoint-javascript-app-using-oauth-implicit-grant/
**[[Microsoft Azure Active Directory]] [#if197a37]
***[[Azure Active Directory B2C]] [#n13f7bac]

-How to use Application Permission with v2 endpoint and Microsoft Graph – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2016/10/07/application-permission-with-v2-endpoint-and-microsoft-graph/
**子ページ [#d8deccc8]

-v2.0 endpoint の OAuth Token の検証 (Verify) – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2016/03/08/azure-ad-msa-v2-endpoint-validate-id_token/
***[[IDトークン>OpenID Connect - IDトークン]] [#z61b0607]
***[[ユーザー属性クレーム関連>OpenID Connect - ユーザー属性クレーム関連]] [#cab82491]
***[[暗号関連>OpenID Connect - 暗号関連]] [#l779d038]

上記のコンテンツの内容を確認すると、
-Microsoft の組織アカウント (Azure Active Directory, Azure AD) と
-個人アカウント (Microsoft Account, MSA) の
***[[Discovery>OpenID Connect - Discovery]] [#nb01070c]
***[[Dynamic Client Registration>OpenID Connect - Dynamic Client Registration]] [#a2a2eeeb]

双方に対応した v2.0 endpoint (App Model v2) と連携し、~
[[OAuth]] 2.0(ではなく、OpenID Connect)認証をおこない、~
認証結果を他の API (Service) で検証し認証させている。
***[[クライアント認証>OpenID Connect - クライアント認証]] [#n8124d8c]
***[[認証コンテキスト クラス>OpenID Connect - Authentication Context Class Reference]] [#u8929cca]
***[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]] [#j1bd1f74]
***[[Self-Issued OP>OpenID Connect - Self-Issued OP]] [#qa1b8e4d]
***[[CIBA Flow>CIBA(Client Initiated Backchannel Authentication)]] [#nd062205]

*OpenId Connectのサンプル [#l2d6ff73]
**Microsoft.Owin.Security.OpenIdConnect [#i4f26644]
AzureADに対して、OpenId Connectを使用して認証する。

https://github.com/OpenTouryoProject/SampleProgram/tree/master/ASPNET/OpenID_Connect/

***サンプル・アプリケーションをAzure Active Directoryに登録 [#m0e0f2c0]

+Azureの管理ポータルにサインイン。
+Azure Active Directoryのタブを開く。
+サンプル・アプリケーションを登録するテナント(ドメイン)を開く。
+[Applications]タブに移動し、ページの下部の[Add]アイコンををクリック。
+[What do you want to do?]画面で[Add an application my organization is developing]を選択。
+[Tell us about your application]画面が表示される。
++アプリケーションの名前を入力(例:OpenIDConnect_sample)。
++[Web Application and / or Web API]を選択する。
++[Next]をクリックする。
+[App properties]画面が表示される。
++サンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)~
サンプル・プロジェクトのプロパティにある開発サーバのSSL URLプロパティを指定~
http://www.codeproject.com/Tips/766918/Visual-Studio-Use-HTTPS-SSL-On-Web-Application-Pro
++アプリのID URIを入力(例:https://<your_tenant_name>/OpenIDConnect_sample)~
'<your_tenant_name>はAzure ADのテナント(ドメイン)名。
++[Complete]をクリック。

***サンプル・アプリケーションの構成 [#a7737c8d]
+web.configファイルを開く。
+FxTenantにAzure ADのテナント(ドメイン)名を指定(例:xxxxx.onmicrosoft.com)
+FxClientId にAzureのポータルから入手することができるClient IDを指定
++クライアントIDを取得するには、
++Azureの管理ポータルにサインイン。
++Azure Active Directoryのタブを開く。
++サンプル・アプリケーションを登録したテナント(ドメイン)を開く。
++[Applications]タブに移動しサンプル・アプリケーションを選択。
++アプリケーション画面で[ACCESS WEB APIS IN OTHER APPLICATIONS]を選択。
++Client IDをコピー。
+FxPostLogoutRedirectUriにサンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)

***サンプル・アプリケーションの構成 [#t8486caa]
F5実行でリダイレクトされた先のAzure AD(STS)で認証できることを確認する。

----
Tags: [[:認証基盤]], [[:クレームベース認証]]
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS