「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
以下の弱点のために、
以下の攻撃が可能。
対策として、認可リクエストのパラメタ群をJWTで送信する
(認証要求に署名し、オプションで暗号化できる。)
本OAuth 2.0 拡張がOpenID Connectによって追加された。
このアプリケーション層セキュリティの使用により、
本仕様(コンテキスト)中で、「サード・パーティー」という用語は、以下に関連する。
JWT化された認可リクエストのパラメタ群をRequestオブジェクトと呼ぶ。
Requestオブジェクト(JWT)のペイロードをbase64urlデコードした文字列。
認可Requestの全てのパラメタがRequestオブジェクトに同梱されている。
{
  "alg": "RS256",
  "kid": "k2bdc"
}{
 "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
}{
  "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"
        ]
      }
    }
  }
}署名を検証する場合、JWK形式で表されるRSA公開鍵を使用する。
※ jwks_uriにJWK Setを公開する。
{
    "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オブジェクトの渡し方にはrequestとrequest_uriの2つのパラメタを使用する方法がある。
Requestオブジェクトの値を直接渡す。
https://server.example.com/authorize?request=eyJhbG..AlMGzw
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値の同梱が必要。
(下位互換などのため、)QueryString?に同じパラメタが指定できるダケ。
GET /request.jwt HTTP/1.1 Host: tfp.example.org
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)・・・https://tfp.example.org/request.jwt#GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
下記手順で取得したRequestオブジェクトを署名検証(若しくは復号)する。
この章に書かれている「jwks_uriにJWK Setを公開」する実装例は、
Requestオブジェクトが暗号化されている場合、
下記手順で取得したRequestオブジェクトを復号化する。
を取り出す。
復号化に失敗した場合、Authorization Serverは「invalid_request_object」エラーを返す。
下記手順で取得したRequestオブジェクトを署名検証する。
署名検証に失敗した場合、Authorization Serverは「invalid_request_object」エラーを返す。
Authorization Serverは、
TLSをサポートしなければならない。
認可リクエストの送信元は常に検証されなければならない。
request_uriのサーバ証明書のIDを帯域外で知っている必要がある
(ただし、これは、一般的に信頼された方法ではない(ので後述が推奨?))。
Authorization Serverは、
※ FAPI Part 2に実例がある。
上記エンドポイントがサード・パーティーのTrust Framework Providerによって提供されても良い。
以下のエンドポイント間のリンクを張る拡張仕様が必要。
([FETT]で紹介されたクロスフェーズ攻撃を防止する)
(再帰的GETもできそうだが・・・?)
RFC6973
個人情報保護法のため、個人情報を含む場合、厳密にscopeを制限するべき。
Tags: :IT国際標準, :認証基盤, :クレームベース認証, :OAuth