長い!タイトル長い!昨日お酒を飲んでいる時に教えてもらったのでメモ。
http://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-06
端的に内容を書くと、その名の通り
- OAuth2の各種フローにおけるclient認証にJWT Bearerを使えるように
- OAuth2のauthorization grantとしてJWT Bearerを使えるように
という内容の二本立て。前者は例えばauthorization codeでのtoken endpointへのtoken request発射時にBasic認証の代わりに使うとかそんな話で、後者はgrant_type=urn:ietf:params:oauth:grant-type:jwt-bearerとしてtoken endpointにJWT投げつけてaccess tokenを得るという、つまるところgrant_typeの追加である。
draftにはこの両方が併記されていてちょっと分かりづらいのだが、これらの用途が本来別々のものであることは明らかである。
このdraftはAssertion Framework for OAuth 2.0 Client Authentication and Authorization Grantsというdraftに乗っかった上で書かれている。そちらのdraftに書かれているのは、
- OAuth2の各種フローにおけるClient認証に新しい手段を追加するためのシンタックスの定義
- OAuth2のauthorization grantに新しいgrant_typeを追加するためのシンタックスの定義
というメタプロトコル的 (?) な何かである。その性質上抽象的なことが書いてあるので、draft-ietf-oauth-jwt-bearer-06のような具体的な適用例から読んだ方がよい。Assertion Frameworkから先に読むとおそらく理解に無駄な時間がかかる。
このdraftの理屈上、client認証をJWT Bearerでやりつつauthorization grantにもJWT Bearerを用いる、ということも可能である。次のようなリクエストになるだろう。
POST /token.oauth2 HTTP/1.1 Host: authz.example.net Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer &assertion=eyJhbGciOiJFUzI1NiJ9.eyJpc3Mi[...omitted for brevity...].J9l-ZhwP[...omitted for brevity...] &client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer &client_assertion=eyJhbGciOiJSUzI1NiJ9.eyJpc3Mi[...omitted for brevity...].cC4hiUPo[...omitted for brevity...]
JWTまみれ!
See also: OAuth 2.0 JWT Bearer Token Flow