-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OIDCRequestObject
- 戻る(OpenID Connect)
- OpenID Connect - Requestオブジェクト
- JWT Secured Authorization Request (JAR)
- JARM
Final を参照して記述。
- Authorization Request に署名および暗号化を可能にする。
- 具体的には、OAuthやOpenID Connectの
パラメタ群を JWTにして送信する。
補足(なぜ必要か): 通常の認可リクエストは
URL のクエリ パラメタとして、ブラウザ経由で送られる。
このため、
問題 内容 改ざん ブラウザ上のマルウェアが scopeやredirect_uriを書き換えられる送信者が不明 Authorization Server は「本当にその Client からか」を確認できない 盗み見 履歴・ログ・Referer に残る Request オブジェクトは、パラメタ群を1 つの署名済み JWT に
まとめることでこれを解決する。
FAPIが「メッセージ自体の認証が無い」と指摘した問題への回答である。
(Client から JWTを送信するという意味では、)
JWT bearer token authorization グラント種別(MS_JWTBearerGrant.md)の
亜種的仕様。
- Discovery(
MS_OIDCDiscovery.md)のパラメタでサポート状況を確認できる。request_parameter_supportedrequest_uri_parameter_supported
- 要求をサポートしていない場合、それぞれ
request_not_supported/request_uri_not_supportedエラーを返す。
Request オブジェクトを利用する場合、
-
request,request_uriパラメタに指定する。 - 他のパラメタを送信するケースがある。
補足(
iss/audが逆になる意味): 方向が逆なので、
誰が誰に向けて発行したかも逆になる。
発行者 ( iss)対象 ( aud)ID トークン Authorization Server Client Request オブジェクト Client Authorization Server つまり Request オブジェクトは
「Client が自分で署名して Authorization Server に渡す JWT」であり、
これ自体がクライアント認証の役割も果たしうる。
FAPI Part 2が認可エンドポイントでの
クライアント認証として Request オブジェクトを挙げているのはこのためである。
{
"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"]}
}
}
}補足(
alg: noneを許すのは危険): 「署名および暗号化の
アルゴリズムは任意(noneも可)」という仕様上の緩さは、
JWAで述べたalg: none問題そのものである。署名しない Request オブジェクトは、
URL パラメタで送るのと保護レベルが変わらない(むしろ検証を
素通りさせる分だけ危うい)。
FAPIや JARではnoneが禁止され、
PS256/ES256に限定されている。
https://server.example.com/authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&scope=openid
&state=af0ifjsldkj&nonce=n-0S6_WzA2Mj
&request=<Requestオブジェクト(JWT)>
- 512 ASCII 文字以内
- Authorization Server からのアクセスに限定する。
- ライフタイムに応じた適切なエントロピー、
- 若しくは、なんらかのアクセスコントロールの実施。
https://client.example.org/request.jwt#GkurKxf5T0Y-mnPFCHqWOMiZi4VS138cQO_V7PZHAdM
※ URI フラグメントは、キャッシュに使用するペイロードの
SHA-256 ハッシュの Base64URL 値
https://server.example.com/authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&scope=openid
&state=af0ifjsldkj&nonce=n-0S6_WzA2Mj
&request_uri=https%3A%2F%2Fclient.example.org%2Frequest.jwt%23GkurKx...
補足(
request_uriは PAR へ発展した):request_uri方式は
「URL が長くなる問題」を解決したが、別の課題を生んだ。
課題 内容 Client が公開サーバーを持つ必要 request.jwtをホストしなければならないSSRF のリスク Authorization Server が任意の URL を取りに行く 事前登録が要る 取りに行く先を制限するため これを解決したのが PAR(Pushed Authorization Requests、RFC 9126) である。
- Client が Authorization Server に直接 POST する(バックチャネル)。
- Authorization Server が
request_uriを発行して返す。方向が逆になることで、Client 側のホスティングも SSRF の懸念も消える。
FAPI 2.0 では PAR が必須になっている。なお、元 Wiki には PAR の独立したページが存在しないため、
ここでは RFC を直接参照する。
RFC 9126: https://datatracker.ietf.org/doc/html/rfc9126
- OpenID Connect Core 1.0 > 6. Passing Request Parameters as JWTs
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#JWTRequests
- JWT bearer token authorization グラント種別(
MS_JWTBearerGrant.md)
Client から OP(IdP/STS) に JWTを送るという意味では似ている。 -
JWT Secured Authorization Request (JAR)
別途、仕様に書き起こしたもの(FAPI2でも使用するので)。
Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, OAuth
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。