JWT-Secured Authorization Requests(JAR)を使った認可コードフロー
JWTで保護された認可要求(JAR)は、OAuth2プロトコルの拡張であり、認可要求パラメータの整合性を保護するためにセキュリティレイヤーを追加します。
前提条件
JARを使用するには、まずRSAキーペアを生成する必要があります。次に、JWTで保護された認可要求の構成の説明に従って、公開鍵をAuth0に登録します。
認可コードフロー中に、クライアントアプリケーションは/authorize
または/oauth/par
エンドポイントに送信するパラメーターを取得し、それらをJSON Webトークン (JWT)にラップして、秘密鍵を使用して署名します。
認可サーバーは、アプリケーションの公開鍵を使用して署名を検証します。署名が有効な場合、認可サーバーは JARから要求パラメータを抽出し、通常どおり要求を処理します。その結果、パラメータ値は既知のソースから取得されることが保証され、仲介者によって改ざんされたりアクセスされたりすることはできません。
JAR要求を生成する
JAR要求を生成するには、まず JSON Webトークン(JWT)を作成する必要があります。Auth0 JWTライブラリを使用すると、好みの言語でJWTを生成できます。
ヘッダー
JAR要求の場合、JWTヘッダーには次のフィールドが含まれている必要があります:
alg
:JWTに署名するために使用されるアルゴリズム。RS256、RS384、またはPS256のいずれかである必要があります。typ
:JWTの種類です。jwt
またはoauth-authz-req+jwt
のいずれかである必要があります。
ヘッダーには、JWTの署名に使用されるキーを識別するkid
フィールドも含まれる場合があります。kid
が存在する場合、Auth0はJAR構成中に登録された、一致するキーIDを持つ公開鍵を探し、そのキーを使用してJWTの署名を検証します。
ペイロード
JWTペイロードには次のクレームが含まれている必要があります:
iss
:これにはアプリのclient_id
が含まれている必要がありますaud
:これは、プロトコルと末尾のスラッシュが付いたテナントのドメインである必要があります。例えば、https://your_domain.auth0.com/
JWTには、/authorize
の呼び出しに必要なパラメータも含まれている必要があります。例:
client_id
:これにはアプリのclient_id
も含まれている必要がありますresponse_type
:Auth0に、実行するOAuth 2.0フローを示します。認可コード付与フローにcode
を使用します。
JWTには、audience
、scope
、state
、redirect_uri
など、要求されている認可フローのオプションパラメータが含まれる場合があります。
さらに、JWTには次のオプションのクレームが含まれる場合があります:
iat
:数値の日付である必要があります。nbf
:過去の時間を表す数値の日付である必要があります。exp
:将来の時刻を表す数値の日付である必要があります。jti
:64バイト以下の文字列である必要があります。
JWTの生成例
次のJavaScriptコードサンプルは、JavaScriptおよびjsonwebtokenライブラリを使用してJWTを構築および署名する方法を示しています。生成されたJWTをコンソールに出力します:
const jwt = require('jsonwebtoken');
const crypto = require("crypto");
const fs = require('fs');
const privateKey = fs.readFileSync('[PATH TO YOUR PEM FILE]');
const client_id = '[YOUR CLIENT ID]';
const nonce = crypto.randomBytes(16).toString('hex');
const requestObject = jwt.sign(
{
iss: client_id,
aud: 'https://your_tenant.auth0.com/', // your tenant's domain
client_id,
response_type: "code",
scope: "openid profile",
redirect_uri : "https://myapp.com/callback" // your app's callback URL
nonce
},
privateKey,
{
keyid: '[YOUR KID]', // optional key id (kid) value from your public key
algorithm: 'RS256',
header: {
typ: 'oauth-authz-req+jwt',
},
});
console.log(requestObject);
Was this helpful?
認可エンドポイントを呼び出す
署名されたJWTを使用して/authorize
エンドポイントを呼び出すには、新しいブラウザウィンドウを開きます。クライアントIDをclient_id
パラメータとして渡し、署名およびURLエンコードされたJWTをrequest
パラメータとして渡します。
# MacOS
open "https://your_tenant.auth0.com/authorize?client_id=[YOUR CLIENT ID]&request=[URL ENCODED JWT]"
# Windows
explorer "https://your_tenant.auth0.com/authorize?client_id=[YOUR CLIENT ID]&request=[URL ENCODED JWT]"
Was this helpful?