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

-[[戻る>JWTとOAuth2.0#bdaa0ed5]]

* 目次 [#l3592235]
#contents

*概要 [#r41f749f]
※ このページは、ドラフト 15 を参考にして作成。

**弱点 [#md2aded4]
以下の弱点のために、

-通信の送信元が認証されていない。

-TLS末端は保護されないため、パラメタ汚染、通信監視が可能。
--TLSセッションは、UserAgentで終了する。
--TLSセッションは、ロードバランサなど(ミドルボックス)で時期尚早に終了することがある。

**攻撃 [#s0e182ac]
以下の攻撃が可能。

-Redirect URI書き換え攻撃
-ミックスアタック攻撃[FETT]

**対策 [#j0e1699d]
対策として、認可リクエストのパラメタ群を[[JWT]]で送信する~
(認証要求に署名し、オプションで暗号化できる。)~
本[[OAuth 2.0 拡張]]が[[OpenID Connect]]によって追加された。

**効果 [#d046bbb6]
このアプリケーション層セキュリティの使用により、
-許可要求の機密性、完全性が達成され、
-これらの問題が緩和される。

*詳細 [#l71999b4]

**Requestオブジェクト [#vb813dbf]
[[JWT]]化された認可リクエストのパラメタ群をRequestオブジェクトと呼ぶ。

***生成方法 [#ra39c605]
-Requestオブジェクト([[JWT]])は、
--[[JWS]]で署名し、
--必要に応じて[[JWE]]で暗号化する。

-署名と暗号化が必要な場合、
--[RFC7519]の11.2節を参照

***効果 [#t72713f4]
-合意した以上のアクセス権を要求できないようにすることで、プライバシーを保護する。

-以下のようなケースにも適合する。
--送信される要求のサイズを小さくすることが望ましい場合(秘密鍵?)。
--Clientが暗号を行いたくないとき([[JWS]]で署名し、TLSを使用する)。

***クレームセット [#od26debf]
Requestオブジェクト([[JWT]])のペイロードをbase64urlデコードした文字列。~
認可Requestの全てのパラメタがRequestオブジェクトに同梱されている。

-ヘッダ(共通)
 {
   "alg": "RS256",
   "kid": "k2bdc"
 }

-ペイロード~
※ nonceやmax_ageなどの拡張変数が含まれる。

--通常
 {
  "iss": "s6BhdRkqt3",
  "aud": "https://server.example.com",
  "response_type": "code id_token",
  "client_id": "s6BhdRkqt3",
  "redirect_uri": "https://client.example.org/cb",
  "scope": "openid",
  "state": "af0ifjsldkj",
  "nonce": "n-0S6_WzA2Mj",
  "max_age": 86400
 }

--[[claimsリクエスト・パラメタ>OpenID Connect#e26320e4]]を含む。
 {
   "iss": "s6BhdRkqt3",
   "aud": "https://server.example.com",
   "response_type": "code id_token",
   "client_id": "s6BhdRkqt3",
   "redirect_uri": "https://client.example.org/cb",
   "scope": "openid",
   "state": "af0ifjsldkj",
   "nonce": "n-0S6_WzA2Mj",
   "max_age": 86400,
   "claims": {
     "userinfo": {
       "given_name": {
         "essential": true
       },
       "nickname": null,
       "email": {
         "essential": true
       },
       "email_verified": {
         "essential": true
       },
       "picture": null
     },
     "id_token": {
       "gender": null,
       "birthdate": {
         "essential": true
       },
       "acr": {
         "values": [
           "urn:mace:incommon:iap:silver"
         ]
       }
     }
   }
 }

***公開鍵 [#lcd844f4]
署名を検証する場合、[[JWK]]形式で表されるRSA公開鍵を使用する。

 {
     "kty":"RSA",
     "kid":"k2bdc",
     "n":"y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE5P
         7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5OaaXDF
         I6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVjdEFgZa
         ZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghLL0HzOuYR
         adBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUGsqkNA9b3xV
         W53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw",
     "e":"AQAB"
 }

**Requestオブジェクトの渡し方 [#cf64a89f]
Requestオブジェクトの渡し方には "request" と "request_uri" の2つのパラメタを使用する方法がある。
- "request" と "request_uri" パラメタを、[[OAuth]] 2.0 の追加の認証要求パラメタとして導入。 
-パラメタは「application/x-www-form-urlencoded = QueryString」として渡す。

***requestパラメタ [#ye252787]
Requestオブジェクトの値を直接渡す。

-認可エンドポイント
 GET /authz?request=eyJhbG..AlMGzw HTTP/1.1
 Host: server.example.com

***request_uriパラメタ [#lcb4340f]
-認可エンドポイント
--Requestオブジェクトの場所をuriで伝える。
--uriは、512 ASCII文字を超えてはならない。
 https://server.example.com/authorize?
   response_type=code%20id_token
   &client_id=s6BhdRkqt3
   &request_uri=https%3A%2F%2Ftfp.example.org%2Frequest.jwt
   %23GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
   &state=af0ifjsldkj

※ この場合、response_type, client_id, state値の同梱は不要?

-request_uriエンドポイント
通常は、ローカルの検索ではなく、HTTPのRequestを行う。

--Request
 GET /request.jwt HTTP/1.1
 Host: tfp.example.org

--Response
 HTTP/1.1 200 OK
     Date: Thu, 16 Feb 2017 23:52:39 GMT
     Server: Apache/2.2.22 (tfp.example.org)
     Content-type: application/jwt
     Content-Length: 1250
     Last-Modified: Wed, 15 Feb 2017 23:52:32 GMT
 
     ey・・・(JWT)・・・

--アクセス制御対策
---第三者に公開しても良い。
---Authorization Serverだけ公開するパラメタを含む場合、~
以下のように、存続期間に適切なエントロピーを持たせる。
 https://tfp.example.org/request.jwt#GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM

*実装 [#r8ebe8ae]
**Requestオブジェクトの復号 [#c69daf29]
下記手順で取得したRequestオブジェクトを複合する。

***復号化の処理 [#t8fedcf6]
-Requestオブジェクトの署名・検証(若しくは復号)用の鍵を取得。~
・・・クライアント・メタデータが、

--登録されている場合、~
[[JWK Set>JWK#od5799a4]]をjwks クライアントメタデータ値から取得。

--登録されていない場合、~
jwks_uriからクライアント・メタデータ([[JWK Set>JWK#od5799a4]])を取得。

-Requestオブジェクトから認可エンドポイントへのパラメタを取り出す。

***復号化の失敗 [#md2d1ce6]
復号化に失敗した場合、Authorization Serverは「invalid_request_object」エラーを返す。

*参考 [#o4d0aa71]
-The OAuth 2.0 Authorization Framework:~
JWT Secured Authorization Request (JAR)~
https://tools.ietf.org/html/draft-ietf-oauth-jwsreq

*?? [#nd472710]
** [#c6029f6a]
(d)  (collection minimization) The request can be signed by a third party attesting that the authorization request is compliant with a certain policy.  For example, a request can be pre-examined by a third party that all the personal data requested is strictly necessary to perform the process that the end-user asked for, and statically signed by that third party.  The authorization server then examines the signature and shows the conformance status to the end-user, who would have some assurance as to the legitimacy of the request when authorizing it.  In some cases, it may even be desirable to skip the authorization dialogue under such circumstances.

** [#w2094d63]
For example, the authorization server may provide a URL to which the client POSTs the request object and obtains the Requiest URI.  This URI is the Request Object URI, "request_uri".


----
Tags: [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]

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