「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>OpenID Connect]] * 目次 [#r5d86f62] #contents *概要 [#qae6a8c8] Finalを参照して記述。 Client(RP)が、([[Discovery>OpenID Connect - Discovery]]で発見した)Idp/STS(OP)に、動的な登録を行う、~ 「クライアント登録エンドポイント」の仕様について記載してある。 *詳細 [#i6dcb77f] TLSサポートと、TLS証明書のチェックが必要。 **クライアント・メタデータ [#g8c43bbe] ***用途 [#zfff9bfe] クライアント・メタデータの値は、次の2つの方法で使用される。 -入出力値 --入力値: 登録要求時の --出力値: 登録応答および読み取り応答の -[[OpenID Connect]]によって使用される。 ***多言語化 [#j8554af5] -client_name、tos_uri、policy_uri、logo_uri、およびclient_uriなどの値は、~ 一部のクライアント登録で複数のロケール固有の値を持つことがある。 -この場合、同様に、[[言語タグ>OpenID Connect - ユーザー属性クレーム関連#u1556f80]]を使用する。 ***一覧 [#d8f5ca0e] -基本パラメタ |#|パラメタ|要件|説明|h |1|redirect_uris|&color(red){REQUIRED};|登録したクライアントのredirect_uriのJSON配列| |2|response_types|OPTIONAL|[[response_type>OpenID Connect#aff816e3]]値のJSON配列。既定値は「code」。| |3|grant_types|OPTIONAL|[[grant_type>OAuth#p23cde9e]]値のJSON配列。既定値は「authorization_code」。| |4|subject_type|OPTIONAL|[[subject_types_supported>OpenID Connect - Discovery#t527fffb]]に対応する[[subクレームの種類(public or pairwise)>OpenID Connect#cf801b20]]| |5|sector_identifier_uri|OPTIONAL|[[pairwise値の計算に利用する>OpenID Connect#cf801b20]](pairwiseをサポートする場合は必須)。| |5|sector_identifier_uri|OPTIONAL|[[pairwise値の計算に利用する>OpenID Connect#cf801b20]](pairwiseをサポートする場合はあると良い)。| -その他パラメタ |#|パラメタ|要件|説明|h |1|default_max_age|OPTIONAL|デフォルトの最大認証期間。max_age要求パラメタの既定値。| |2|require_auth_time|OPTIONAL|[[IDトークン>OpenID Connect - IDトークン]]のauth_time要求の要否| |3|token_endpoint_auth_method|OPTIONAL|[[クライアント認証>OpenID Connect - クライアント認証]]のタイプ。&br;既定値はclient_secret_basic。| |4|default_acr_values|OPTIONAL|デフォルトの[[認証コンテキスト クラス>OpenID Connect - Authentication Context Class Reference]]参照値。acr_values要求パラメタの既定値。| |5|request_uris|OPTIONAL|事前に登録されたrequest_uri値の配列。&br;[[Discovery の require_request_uri_registration>OpenID Connect - Discovery#z9123ea9]]で事前登録要求可能| |6|initiate_login_uri|OPTIONAL|[[ログイン開始エンドポイント>OpenID Connect#ze94647d]]のURL| -クライアント情報パラメタ |#|パラメタ|要件|説明|h |1|application_type|OPTIONAL|native or webのJSON配列。既定値は「web」。| |2|contacts|OPTIONAL|クライアントを担当する担当者の電子メールアドレスの配列。| |3|client_name|OPTIONAL|クライアントがエンドユーザに提示する、クライアント名。| |4|logo_uri|OPTIONAL|クライアントがエンドユーザに提示する、アプリケーションのロゴのURL。| |5|client_uri|OPTIONAL|クライアントがエンドユーザに提示する、ホームページのURL。| |6|policy_uri|OPTIONAL|クライアントがエンドユーザに提示する、プロファイル利用規約のURL。| |7|tos_uri|OPTIONAL|クライアントがエンドユーザに提示する、サービス利用規約のURL。| -暗号関連パラメタ |#|>|パラメタ|要件|説明|h |1|>|>|>|[[JWK]]| |1-1||jwks|OPTIONAL|[[JWK Set>JWK#j5494828]]| |1-2||jwks_uri|OPTIONAL|[[jwks_uri>OpenID Connect - 暗号関連#tdf4ee76]]| |2|>|>|>|[[クライアント認証>OpenID Connect - クライアント認証]]| |2-1|>|token_endpoint_auth_signing_alg|OPTIONAL|[[クライアント認証>OpenID Connect - クライアント認証]]署名アルゴリズム&br;([[Discovery の token_endpoint_auth_signing_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はRS256, 署名なし不可。| |3|>|>|>|[[IDトークン>OpenID Connect - IDトークン]]| |3-1||id_token_signed_response_alg|OPTIONAL|[[IDトークン>OpenID Connect - IDトークン]]署名アルゴリズム&br;([[Discovery の id_token_signing_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はRS256。| |3-2||id_token_encrypted_response_alg|OPTIONAL|[[IDトークン>OpenID Connect - IDトークン]]暗号化アルゴリズム&br;([[Discovery の id_token_encryption_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値は暗号化なし。| |3-3||id_token_encrypted_response_enc|OPTIONAL|[[IDトークン>OpenID Connect - IDトークン]]暗号化アルゴリズム&br;([[Discovery の id_token_encryption_enc_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はA128CBC-HS256(algがあれば必要)。| |4|>|>|>|[[ユーザー属性エンドポイント>OpenID Connect - ユーザー属性クレーム関連#k1d9c845]]| |4-1||userinfo_signed_response_alg|OPTIONAL|[[ユーザー属性エンドポイント>OpenID Connect - ユーザー属性クレーム関連#k1d9c845]]署名アルゴリズム&br;([[Discovery の userinfo_signing_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値は署名なし。| |4-2||userinfo_encrypted_response_alg|OPTIONAL|[[ユーザー属性エンドポイント>OpenID Connect - ユーザー属性クレーム関連#k1d9c845]]暗号化アルゴリズム&br;([[Discovery の userinfo_encryption_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値は暗号化なし。| |4-3||userinfo_encrypted_response_enc|OPTIONAL|[[ユーザー属性エンドポイント>OpenID Connect - ユーザー属性クレーム関連#k1d9c845]]暗号化アルゴリズム&br;([[Discovery の userinfo_encryption_enc_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はA128CBC-HS256(algがあれば必要)。| |5|>|>|>|[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]]| |5-1||request_object_signing_alg|OPTIONAL|[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]]署名アルゴリズム&br;([[Discovery の request_object_signing_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はRS256, 署名なし可。| |5-2||request_object_encryption_alg|OPTIONAL|[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]]暗号化アルゴリズム&br;([[Discovery の request_object_encryption_alg_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はRPの宣言なし。| |5-3||request_object_encryption_enc|OPTIONAL|[[Requestオブジェクト>OpenID Connect - Requestオブジェクト]]暗号化アルゴリズム&br;([[Discovery の request_object_encryption_enc_values_supported>OpenID Connect - Discovery#w858cfce]]に対応)&br;既定値はA128CBC-HS256(algがあれば必要)。| **クライアント登録エンドポイント [#n38a9d2e] ***初期アクセス トークン [#j78fcca0] -公開動的登録をサポートする場合、エンドポイントは初期アクセス トークンなしで登録要求を受け入れるべき。 -(この仕様の範囲外の方法で)初期アクセス トークンを要求し、許可されたクライアントだけに登録要求を制限することができる。 ***登録リクエスト [#j84b36aa] -パラメタ一覧~ 任意の[[クライアント・メタデータ>#g8c43bbe]]のパラメタを使用して、~ HTTP POSTメッセージをクライアント登録エンドポイントに送信 -例 POST /connect/register HTTP/1.1 Content-Type: application/json Accept: application/json Host: server.example.com Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJ ... { "application_type": "web", "redirect_uris": ["https://client.example.org/callback", "https://client.example.org/callback2"], "client_name": "My Example", "client_name#ja-Jpan-JP": "クライアント名", "logo_uri": "https://client.example.org/logo.png", "subject_type": "pairwise", "sector_identifier_uri": "https://other.example.net/file_of_redirect_uris.json", "token_endpoint_auth_method": "client_secret_basic", "jwks_uri": "https://client.example.org/my_public_keys.jwks", "userinfo_encrypted_response_alg": "RSA1_5", "userinfo_encrypted_response_enc": "A128CBC-HS256", "contacts": ["ve7jtb@example.org", "mary@example.org"], "request_uris": ["https://client.example.org/rf.txt #qpXaRLh_n93TTR9F252ValdatUQvQiJi5BDub2BeznA"] } ***登録レスポンス [#xaa258be] 登録メタデータとともに、プロビジョニングされたフィールドを含めて返す。 -パラメタ一覧 --成功 |#|パラメタ|要件|説明|h |1|client_id|&color(red){REQUIRED};|登録したクライアントのclient_id| |2|client_id_issued_at|OPTIONAL|client_idが発行された時刻。| |3|client_secret|OPTIONAL|登録したクライアントのclient_secret&br;(PKCEやprivate_key_jwtなどのケースがあるので)| |4|client_secret_expires_at|&color(red){REQUIRED};|client_secretが期限切れになる時刻。&br;(client_secretが発行された場合は必須)| |5|registration_access_token|OPTIONAL|後続のクライアント登録操作を実行するための[[登録アクセス トークン>#pfe81c92]]。| |6|registration_client_uri|OPTIONAL|前述のregistration_access_tokenを使用して、&br;後続のクライアント登録操作を実行するための構成エンドポイントの場所。| --失敗~ [[RFC 6750 - Bearer Token Usage>OAuth#d65223fc]]のSection 3と同じ。 -例 --成功 HTTP/1.1 201 Created Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "client_id": "s6BhdRkqt3", "client_secret": "ZJYCqe3GGRvdrudKyZS0XhGv_Z45DuKhCUk0gBR1vZk", "client_secret_expires_at": 1577858400, "registration_access_token": "this.is.an.access.token.value.ffx83", "registration_client_uri": "https://server.example.com/connect/register?client_id=s6BhdRkqt3", "token_endpoint_auth_method": "client_secret_basic", "application_type": "web", "redirect_uris": ["https://client.example.org/callback", "https://client.example.org/callback2"], "client_name": "My Example", "client_name#ja-Jpan-JP": "クライアント名", "logo_uri": "https://client.example.org/logo.png", "subject_type": "pairwise", "sector_identifier_uri": "https://other.example.net/file_of_redirect_uris.json", "jwks_uri": "https://client.example.org/my_public_keys.jwks", "userinfo_encrypted_response_alg": "RSA1_5", "userinfo_encrypted_response_enc": "A128CBC-HS256", "contacts": ["ve7jtb@example.org", "mary@example.org"], "request_uris": ["https://client.example.org/rf.txt #qpXaRLh_n93TTR9F252ValdatUQvQiJi5BDub2BeznA"] } --失敗 HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "error": "invalid_redirect_uri", "error_description": "One or more redirect_uri values are invalid" } **クライアント構成エンドポイント [#l4b18bb4] 定義された仕様はHTTP GETメソッドのみ ***登録アクセス トークン [#pfe81c92] registration_access_tokenで返された登録アクセス トークンを使用 ***構成の更新リクエスト・レスポンス [#j8c9aa0e] -リクエスト~ registration_client_uriで返されたURLとQueryStringを使用して、~ 任意の[[クライアント・メタデータ>#g8c43bbe]]のパラメタを送る。 -レスポンス~ ・・・ -参考: [[OAuth 2.0 の Registration>#mbae0504]] ***構成の読取リクエスト・レスポンス [#o7983938] -リクエスト~ GET /connect/register?client_id=s6BhdRkqt3 HTTP/1.1 Accept: application/json Host: server.example.com Authorization: Bearer this.is.an.access.token.value.ffx83 -レスポンス --成功 更新されていない限り、registration_access_tokenまたはregistration_client_uri値を含める必要はない。 HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache { "client_id": "s6BhdRkqt3", "client_secret": "OylyaC56ijpAQ7G5ZZGL7MMQ6Ap6mEeuhSTFVps2N4Q", "client_secret_expires_at": 17514165600, "registration_client_uri": "https://server.example.com/connect/register?client_id=s6BhdRkqt3", "token_endpoint_auth_method": "client_secret_basic", "application_type": "web", "redirect_uris": ["https://client.example.org/callback", "https://client.example.org/callback2"], "client_name": "My Example", "client_name#ja-Jpan-JP": "クライアント名", "logo_uri": "https://client.example.org/logo.png", "subject_type": "pairwise", "sector_identifier_uri": "https://other.example.net/file_of_redirect_uris.json", "jwks_uri": "https://client.example.org/my_public_keys.jwks", "userinfo_encrypted_response_alg": "RSA1_5", "userinfo_encrypted_response_enc": "A128CBC-HS256", "contacts": ["ve7jtb@example.org", "mary@example.org"], "request_uris": ["https://client.example.org/rf.txt #qpXaRLh_n93TTR9F252ValdatUQvQiJi5BDub2BeznA"] } --失敗 HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer error="invalid_token", error_description="The access token expired" Cache-Control: no-store Pragma: no-cache **sector_identifier_uri検証 [#o862ecdd] ***sector_identifier_uri値 [#l58e0058] -httpsスキームを使用するURL --[[pairwiseのsubクレーム値>OpenID Connect#cf801b20]]を計算するのに使用する。 -また、redirect_uri値の配列を含むJSONファイルを参照できる。~ --redirect_uri値の配列を含むJSONファイルを参照できる。~ これにより、クライアントの再登録をせずに、redirect_uri値を変更可能。 --また、[[pairwiseのsubクレーム値>OpenID Connect#cf801b20]]を計算するのにも使用する。 -この値は、登録時に検証されなければならない。 ***リクエスト・レスポンス [#se5d1bd3] -リクエスト GET /file_of_redirect_uris.json HTTP/1.1 Accept: application/json Host: other.example.net -レスポンス HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Pragma: no-cache [ "https://client.example.org/callback", "https://client.example.org/callback2", "https://client.other_company.example.net/callback" ] *考慮事項 [#j9384a67] **実装 [#y0cd7a5a] ***OAuth 2.0 の Registration [#mbae0504] 必要に応じて以下をサポートしても良い。 -RFC 7591 - OAuth 2.0 Dynamic Client Registration Protocol~ https://tools.ietf.org/html/rfc7591 -RFC 7592 - OAuth 2.0 Dynamic Client Registration Management Protocol~ https://tools.ietf.org/html/rfc7592 ***プレファイナルIETF仕様 [#j7a042de] - ***ステートレス動的クライアント登録 [#a911fc96] -client_id値にクライアントに関する必要な登録情報をエンコード -クライアントの初期登録によって、以下は返されないため、読み取り操作は不可能。 --登録アクセストークン --クライアント構成エンドポイント **セキュリティ [#o8508727] ***偽装 [#m213e5cd] -クライアント情報パラメタの情報でクライアント偽装がされる可能性がある。 -Idp/STS(OP)はフィッシングのリスクを軽減するために措置を講じる必要がある。 ***ネイティブ・コード・リーク [#afb0a3d7] -カスタムURIスキームの利用によってリークする可能性がある。 -この問題は、IETF OAuthワーキンググループで議論されており、標準的な解決策が開発されることが期待される。 *参考 [#c016f0b4] -Final: OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1~ http://openid.net/specs/openid-connect-registration-1_0.html -sat's memo: OpenID Connect Dynamic Client Registration 1.0 - draft 11 日本語私訳~ http://blog.toke.jp/2012/07/openid-connect-dynamic-client.html **[[Discovery>OpenID Connect - Discovery]] [#uc7b23d6] ---- Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]