-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OIDCUserInfoClaims
- 戻る(OpenID Connect)
Final を参照して記述。
補足(ID トークンとユーザー属性の役割分担): ID トークンは
**「いつ・誰が・どう認証されたか」**を伝えるもので、
本ページで扱うユーザー属性クレーム(プロフィール・メール・住所など)は
**「その人はどういう属性を持つか」**を伝えるものである。
後者は UserInfo エンドポイントから取るのが基本だが、
claimsパラメタで ID トークン側に載せることもできる。
JWT のクレームを除く(sub だけ重複)。
- クレームのグループ名称。
- scope パラメタで使用して当該グループのクレームを要求する。
- クレームの個別名称。
- claims パラメタで使用して当該クレームを要求する。
| 項番 | グループ名 / クレーム名 | 意味 |
|---|---|---|
| 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 | 電子メール | |
| 3-1 | 電子メールアドレス | |
| 3-2 | ・ email_verified | 電子メールアドレスが検証済みか否かの真偽値 |
| 4 | phone | 電話 |
| 4-1 | ・ phone_number | 電話番号 |
| 4-2 | ・ phone_number_verified | 電話番号が検証済みか否かの真偽値 |
| 5 | address | 住所 JSON object。書式は「5.1.1. Address クレーム」に記載。 |
| 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 |
移行メモ(正誤・体裁): 5-1
formattedの説明が
「フォーマットされたフルメールアドレス」となっていたが、
addressの下位項目なので「フル住所」の誤りと判断して修正した。
また、元ページの表はセル結合でグループ名とクレーム名を
2 列に分けていたが、GitHub の Markdown はセル結合に対応していないため、
項番と・のインデントで階層を表す形に整理した。
補足(
*_verifiedは「本人のものと確認済み」の意):email_verified/
phone_number_verifiedは、OP がそのアドレス/番号の到達確認を行い、
本人のものだと確認したことを示す。
RP がアカウント突き合わせ(名寄せ)にメール アドレスを使う場合、
email_verifiedを必ず見る必要がある。
未検証のアドレスで名寄せすると、
他人のアカウントに繋がる恐れがある。
scope パラメタによってユーザー属性クレーム群の格納要求を行うことができる。
前述のグループ名(profile, email, phone, address)を
scope 値に指定可能。
-
UserInfo エンドポイントから UserInfo レスポンス(JSON オブジェクト)として返される。
-
response_type値がid_tokenの場合、- この場合、Access Token が発行されない。
- ユーザー属性クレーム群は ID Token で返却される。
claims パラメタによって、scope パラメタより
詳細なユーザー属性クレーム群の格納要求を行うことができる。
-
userinfoと、id_tokenに対するクレームを要求できる。- 通常、scope パラメタを使用して、クレームを要求するが、
http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims -
claimsパラメタを使用して、クレームを要求することもできる。
http://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter
- 通常、scope パラメタを使用して、クレームを要求するが、
-
claimsパラメタを使用して特定のクレームの返却を要求する。
claimsパラメタは、クレームをリスト化した JSON オブジェクトである。- ユーザー属性クレーム群に含まれていないクレームを要求する唯一の方法。
-
scope パラメタでは指定することが出来ない
ユーザー属性クレーム群の特定の組み合わせを要求する唯一の方法。
個別のクレームの名前をメンバー名とする JSON オブジェクト
-
userinfoメンバ (OPTIONAL)
UserInfo エンドポイントへ返却を要求する個々のクレームのリスト。-
当メンバが存在した場合、
- scope パラメタで要求されたクレームに加え、
- 当メンバでリストされたクレームも返却される。
-
当メンバが存在しなかった場合、
- scope パラメタで要求されたクレームのみが返却される。
-
userinfoメンバを指定する際は、UserInfo Endpoint を使用するために、
response_typeに対し, Access Token を Client に発行するタイプの値を
指定しなければならない。
-
-
id_tokenメンバ (OPTIONAL)
ID トークン内に格納して返却を要求する個々のクレームのリストを示す。-
当メンバが存在した場合、
- デフォルトのクレームに加え
- 当メンバでリストされたクレームも返却される。
-
当メンバが存在しなかった場合、
- デフォルトのクレームのみが返却される。
-
-
null 値
デフォルトの形式 -
JSON 値
-
essential
Essential(必須) or Voluntary(任意){"essential": true} -
value
指定の値を返す(固定値だが、用途不明確){"value": "248289761001"} -
values
優先順に指定の値を返す(許容できる値の範囲)"acr": {"essential": true, "values": ["urn:mace:incommon:iap:silver", "urn:mace:incommon:iap:bronze"]}
-
補足(
valueの用途): 「固定値だが、用途不明確」とされているvalueは、
「この値であることを確認したい」ときに使うものである。
例えば"sub": {"value": "248289761001"}とすれば、
「今ログインしているのがこの利用者であること」を OP に確認させられる
(別人であればエラーになる)。
アカウント連携の再確認や、
ACR の特定値の要求などで使う。
クレーム要求 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"] }
}
}- OAuth 2.0 の Resource Server の WebAPI
- HTTP 的には、HTTPS 必須
-
HTTP の GET と POST メソッドをサポートする。
-
UserInfo リクエストの一例を示す:
GET /userinfo HTTP/1.1
Host: server.exampletechinfoofmicrosofttech.osscons.jp
Authorization: Bearer ・・・・・
-
UserInfo レスポンスは JSON オブジェクトとして返される。
- UserInfo クレームは JSON オブジェクトのメンバとして返される。
- UserInfo レスポンスのクレームセットには、必ず
sub(subject) クレームを含める。 -
ユーザー属性クレーム群に加え、
そこに明記されていないクレームも返却可能。 - IdP(OP)は要求されたクレームの値を、必ずしも返さなくてもよい。
- クレームが返されない場合、null や空文字列ではなく、
JSON オブジェクトのメンバから除かれるべき。
-
JWT による署名 or 暗号化、若しくは、署名 and 暗号化を行う場合
- クレームは JWT で返されるため、Content-Type は
application/jwtとする。 - 署名する場合、
subに加え、iss(issuer) クレームとaud(audience) クレームを含むべき。 - 暗号化のアルゴリズムは Registration による
userinfo_encrypted_response_alg で指定する。 - 署名と暗号化の両方が要求された場合、レスポンスは JWT で定義されているように、
結果はネストされた JWT となり、署名した後に暗号化しなければならない。
- クレームは JWT で返されるため、Content-Type は
-
クライアントによる UserInfo レスポンスの検証
補足(
subの一致確認は必須): UserInfo エンドポイントは
Access Token だけで呼べるため、これ単体では
「今ログインした利用者の情報か」が保証されない。
ID トークンのsubと突き合わせることで初めて、
取得した属性が認証済みの利用者のものだと確認できる
(Token Substitution 攻撃への対策)。
以下に 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"
}- 失敗
HTTP/1.1 401 Unauthorized
WWW-Authenticate: error="invalid_token",
error_description="The Access Token expired"
設定によって、ID トークン相当の情報が、
(OpenID Connect - Discovery、
OpenID Connect - Dynamic Client Registrationを参照)
-
以下の 3 つのクレーム値の表現形式が定義されている。
- Normal クレーム (REQUIRED)
- Aggregated クレーム (OPTIONAL)
- Distributed クレーム (OPTIONAL)
-
なお、Aggregated クレームと、
Distributed クレームは、-
sub値が Claims Provider における End-User の識別子でない限り,
sub(subject) クレームを含むべきでない。 - また OpenID Provider あるいは他の Party が利用するために
sub値を提供すべきでもない。
-
補足(3 つの違い):
種類 クレームの出どころ OP が返すもの Normal OP 自身 値そのもの Aggregated 別の Claims Provider その Provider が署名した JWT(値入り) Distributed 別の Claims Provider 取りに行くための endpoint と access_token Aggregated は値を OP 経由で運ぶのに対し、
Distributed はRP が自分で取りに行く。
銀行の残高や信用スコアのように、
OP に見せたくない/鮮度が要る情報は Distributed が向く。
- OpenID Provider によって直接アサートされたクレーム。
- JSON オブジェクトの中にメンバとして表記される。
{
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}- OpenID Provider 以外の Claims Provider によってアサートされたクレームであるが,
OpenID Provider から返却されるクレーム。 - JSON オブジェクト中で,
_claim_namesおよび_claim_sourcesという
特殊なメンバを用いて表記される。-
_claim_names
_claim_sourcesメンバーの中にあるメンバー名への参照 -
_claim_sources
JWT を値として持つ JSON オブジェクト(subクレームを含まない)
-
- Aggregated クレーム本体
以下をjwt_header.jwt_part2.jwt_part3と JWT 化する。
{
"address": {
"street_address": "1234 Hollywood Blvd.",
"locality": "Los Angeles",
"region": "CA",
"postal_code": "90210",
"country": "US"},
"phone_number": "+1 (310) 123-4567"
}- Aggregated クレームを含むクレームセット
{
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"birthdate": "0000-03-22",
"eye_color": "blue",
"email": "janedoe@example.com",
"_claim_names": {
"address": "src1",
"phone_number": "src1"
},
"_claim_sources": {
"src1": {"JWT": "jwt_header.jwt_part2.jwt_part3"}
}
}- OpenID Provider 以外の Claims Provider によってアサートされたクレームであり,
OpenID Provider からはその参照だけが返却されるクレーム。 - JSON オブジェクト中で,
_claim_namesおよび_claim_sourcesという
特殊なメンバを用いて表記される。-
_claim_names
_claim_sourcesメンバーの中にあるメンバー名への参照 -
_claim_sources
endpoint、access_tokenのメンバと値を含む JSON オブジェクト-
endpoint(REQUIRED):
JWT 形式の Distributed クレームセットを提供するエンドポイントの URL -
access_token(OPTIONAL):
endpoint(Resource Server)を利用するための access_token
-
-
-
Distributed クレーム本体
以下をjwt_header.jwt_part2.jwt_part3と JWT 化して、
エンドポイントからレスポンスする。- その1
{
"shipping_address": {
"street_address": "1234 Hollywood Blvd.",
"locality": "Los Angeles",
"region": "CA",
"postal_code": "90210",
"country": "US"},
"payment_info": "Some_Card 1234 5678 9012 3456",
"phone_number": "+1 (310) 123-4567"
}- その2
{
"credit_score": 650
}- Distributed クレームを含むクレームセット
{
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"email": "janedoe@example.com",
"birthdate": "0000-03-22",
"eye_color": "blue",
"_claim_names": {
"payment_info": "src1",
"shipping_address": "src1",
"credit_score": "src2"
},
"_claim_sources": {
"src1": {"endpoint":
"https://bank.example.com/claim_source"},
"src2": {"endpoint":
"https://creditagency.example.com/claims_here",
"access_token": "ksj3n283dke"}
}
}- クレームによっては多言語化可能
- クレーム名に続いて
#ja-Kana-JPなどの言語タグを付与する。 - 言語タグとしては、BCP47 [RFC5646] 言語タグを使用。
-
Final: OpenID Connect Core 1.0 incorporating errata set 1
-
-
5.1. Standard Claims
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#StandardClaims -
5.2. Claims Languages and Scripts
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ClaimsLanguagesAndScripts -
5.3. UserInfo Endpoint
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#UserInfo -
5.4. Requesting Claims using Scope Values
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ScopeClaims -
5.5. Requesting Claims using the "claims" Request Parameter
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ClaimsParameter -
5.6. Claim Types
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ClaimTypes -
5.7. Claim Stability and Uniqueness
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ClaimStability
-
-
- Subject Identifier Types
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#SubjectIDTypes
- Subject Identifier Types
-
- OpenID Connect
- OpenID Connect - IDトークン
- OpenID Connect - Discovery
- OpenID Connect - Dynamic Client Registration
- JWT
Tags: IT国際標準, 認証基盤, クレームベース認証, OAuth
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。