秘密鍵JWTで認証する

Before you start

まず、Auth0 Dashboardで新しいアプリケーションを作成するか、既存のアプリケーションを変換する必要があります。詳細については、「秘密鍵JWTの認証を構成する」をお読みください。

private_key_jwt:で認証をするには、2つの手順を完了する必要があります。

  1. クライアントアサーションを構築します。このアサーションはキーペアを生成した際に秘密鍵で署名されたJWTです。キーペア生成の詳細については、「秘密鍵JWTの認証を構成する」をお読みください。

  2. Auth0に対してアサーションを使用して認証します。

アサーションを構築する

Auth0のSDKのいずれかを使用して、アサーションを自動的に構築できます。SDKを使用しない場合、ご自身でアサーションを構築する必要があります。

アサーションとは、以下のプロパティとクレームを含む必要があるJSON Web Token(JWT)のことです。

  • ヘッダー

    • alg:アサーションの署名に使用されるアルゴリズム。アルゴリズムはアプリケーションの資格情報を作成した際に指定されたアルゴリズムと一致している必要があります。

    • kid(任意)Auth0が生成した資格情報のkidkidは、資格情報を作成する際に作られます。

  • ペイロード

    • issアプリケーションのクライアントID。この値はアプリケーション設定にあり、[Auth0 Dashboard]>[Applications(アプリケーション)]>[Applications(アプリケーション]に移動して、[Settings(設定)]タブを選択すると見つかります。

    • subアプリケーションのクライアントID。この値もアプリケーション設定で見つけることができます。[Auth0 Dashboard]>[Applications(アプリケーション)]>[Applications(アプリケーション]に移動して、[Settings(設定)]タブを選択します。

    • audアサーションを受け取るAuth0テナントのURLまたはカスタムドメイン。例:https://{yourTenant}.auth0.com/末尾のスラッシュを含めます。

    • iat(任意)とexp:「発行日時」と「有効期限」クレームを正しいタイムスタンプで設定します。クライアントのアサーションは、一度限り使用できるトークンで、可能な限り短い有効期限の設定をお勧めします。Auth0はトークンのライフタイムとして最長5分間をサポートします。

    • jti:クライアントが作成した一意のクレームID。Universally Unique Identifier(UUID)フォーマットの使用をお勧めします。

そしてトークンは、秘密鍵JWT認証のためにアプリケーションを作成または構成した際に生成された秘密鍵で署名される必要があります。その方法については、「JSON Web Tokenの仕様」をご確認ください。

標準ツールやこの機能をサポートするサードパーティライブラリを使用してトークンを構築することを推奨します。ゼロから独自に実装するのは避けてください。サポートしているライブラリの詳細については、JWT.ioのリストを参照してください。

以下の例では、Node.jsスクリプトがjoseパッケージを使用してアサーションを生成しています。

const { SignJWT } = require('jose')
const crypto = require("crypto");
const uuid = require("uuid");

async function main() {
 const privateKeyPEM = crypto.createPrivateKey(/**
   Read the content of your private key here. We recommend to store your private key
   in a secure infrastructure. 
 */);

 const jwt = await new SignJWT({})
   .setProtectedHeader({ 
      alg: 'RS256', // or RS384 or PS256
      kid: '(OPTIONAL) KID_GENERATED_BY_AUTH0' 
   })
   .setIssuedAt()
   .setIssuer('CLIENT_ID')
   .setSubject('CLIENT_ID')
   .setAudience('https://YOUR_TENANT.auth0.com/') // or your CUSTOM_DOMAIN
   .setExpirationTime('1m')
   .setJti(uuid.v4())
   .sign(privateKeyPEM);
  console.log(jwt)
}

main();

Was this helpful?

/

秘密鍵で署名したクライアントアサーションの例

private key example

以下に対応しています。

{
  "alg": "RS256",
  "kid": "my kid"
}
{
  "iat": 1626684584,
  "iss": "my client id",
  "sub": "my client id",
  "aud": "https://mytenant.auth0.com/",
  "exp": 1626684644,
  "jti": "e4dc8ed1-b108-4901-8bbc-c07a791817e7"
}

Was this helpful?

/

必要な情報でJWTを生成したら、Auth0に対してアプリケーションを認証する準備が整います。

アサーションをアクセストークンと交換する

JWTアサーションをアクセストークンと交換するには、以下のパラメーターで認証APIのトークンエンドポイントを呼び出します。

  • $client_assertion:JWTアサーション

  • $resource_server_identifier:リソースサーバーの識別子。詳細については、「APIを登録する」お読みください。

curl --location --request POST 'https://$tenant/oauth/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=client_credentials' \
  --data-urlencode 'client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer' \
  --data-urlencode 'client_assertion=$client_assertion' \
  --data-urlencode 'audience=$resource_server_idenifier'

Was this helpful?

/

サポートされているエンドポイント

https://$tenant/oauth/tokenエンドポイントに加え、以下のAuth0 Authentication APIエンドポイントは、構成済みアプリケーションのprivate_key_jwt認証をサポートしています。

アサーションの制限

JWTアサーションの最大長は2048バイトです。

アサーション内のクレームには次の制限があります。

  • iss:64文字

  • sub:64文字

  • jti:64文字

  • alg:16文字