- OAuth2.0 JWTベアラートークンフローについてメモする。
JWTとは
-
JSON Web Tokenの略称。発音は"ジョット"。
-
属性情報(Claim)をJSON構造で表現したトークン仕様(RFC7519)を指す。
- 発行者(Issuer)、利用者(Audience)、ユーザー(Subject)などが含まれる。
-
特徴
- 署名、暗号化ができる。
- URL-safe(URLとして利用出来る文字だけ構成される)。
-
関連仕様
-
用途
- OAuth2.0 アクセストークンの取得
- OpenID Connect IDトークン(認証情報に関するクレームを含んだトークン)
- など
JWT ベアラートークンフロー
概要
- クライアント側で生成したJWTを指定してトークンリクエストを行う。
- システム間連携を行う際に、認証・接続毎にユーザ操作を行うことができない・したくない場合に利用する。
シーケンス
※Salesforceでのフローを参考に作成。
※署名方式に応じた署名用情報(秘密鍵、証明書)の発行・登録を行う。
1. JWT生成
1. JSON形式でヘッダーを定義し、Base64URLエンコードする(encoded_header
)。以下例。
{
"typ": "JWT",
"alg": "RS256"
}
2. JSONクレームセットを定義し、Base64URLエンコードする(encoded_claims_set
)。以下例。
{
"iss": "3MVG99OxTyEMCQ3gNp2PjkqeZKxnmAiG1xV4oHh9AKL_rSK.BoSVPGZHQukXnVjzRgSuQqGn75NL7yfkQcyy7",
"sub": "my@email.com",
"aud": "https://login.salesforce.com",
"exp": "1333685628"
}
3. エンコード結果を”.”で連結する。
encoded_header+"."+encoded_claims_set
4. ヘッダーに指定したアルゴリズムで3の署名を生成し、Base64URLエンコードする(encoded_signature
)。
5. 3と4を"."で連結する。
encoded_header+"."+encoded_claims_set.+"."+encoded_signature
2. トークンリクエスト
-
リクエスト例
POST /token.oauth2 HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer &assertion=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0. eyJpc3Mi[...omitted for brevity...]. J9l-ZhwP[...omitted for brevity...]
パラメータ | 説明 |
---|---|
grant_type |
urn:ietf:params:oauth:grant-type:jwt-bearer |
assertion |
1で生成したJWT |
3. JWT検証
- デコードし、iss,aud,subなどクレーム値や署名の検証を行う。