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には、audiencescopestateredirect_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?

/

もっと詳しく