メインコンテンツへスキップ

始める前に

続行する前に、Auth0 Dashboard で新しいアプリケーションを作成するか、既存のアプリケーションを変換しておく必要があります。詳しくは、Private Key JWT 認証の設定 を参照してください。
private_key_jwt で認証するには、次の 2 つの手順を完了する必要があります。
  1. クライアントアサーションを作成します。このアサーションは、キーペアの生成時に作成した秘密鍵で署名された JWT です。キーペアの生成方法については、Private Key JWT 認証の設定 を参照してください。
  2. そのアサーションを使用して Auth0 に対する認証を行います。

アサーションを作成する

Auth0 の SDK のいずれかを使用すると、アサーションを自動的に作成できます。SDK を使用しない場合は、アサーションを自分で構築する必要があります。 アサーションは (JWT) であり、次のプロパティとクレームを含める必要があります。
特に明記されていない限り、すべてのクレームが必須です。JWT クレームの詳細については、JSON Web Token Claims を参照してください。
  • ヘッダー
    • alg: アサーションの署名に使用するアルゴリズムです。このアルゴリズムは、アプリケーションの認証情報を作成したときに指定したアルゴリズムと一致している必要があります。
    • kid: (任意) 認証情報に対して Auth0 によって生成された kid です。kid は認証情報の作成時に生成されます。
  • ペイロード
    • iss: アプリケーションのクライアントIDです。この値は、Auth0 Dashboard > Applications > ApplicationsSettings タブにあるアプリケーション設定で確認できます。
    • sub: アプリケーションのクライアントIDです。この値もアプリケーション設定で確認できます。Auth0 Dashboard > Applications > ApplicationsSettings タブを選択してください。
    • aud: アサーションを受け取る Auth0 テナントまたはカスタムドメインの URL です。例: https://{yourTenant}.auth0.com/**。**末尾のスラッシュを含めてください。
      Auth0 テナントにカスタムドメインを設定している場合は、それを aud クレームとして使用できます。この場合は、カスタムドメインを使用することを推奨します。
    • iat (任意) 、nbf (任意) 、および exp: 正しいタイムスタンプに設定された Issued At、Not Before、Expiration の各クレームです。相互運用性を確保するため、iatnbf (存在する場合) には最大 10 秒のクロックスキューが許容されます。クライアントアサーションは 1 回限り使用するトークンであるため、有効期限は可能な限り短くすることを推奨します。Auth0 でサポートされるトークンの lifetime の上限は 5 分です。
    • jti: クライアントが作成する一意のクレーム ID です。Universally Unique Identifier (UUID) 形式の使用を推奨します。
      この JWT は 1 回限り使用するトークンであるため、それを前提に有効期限を短く設定する必要があります。最大 1 分に設定することを推奨します。
その後、トークンは、Private Key JWT 認証 用にアプリケーションを作成または設定した際に生成した秘密鍵で署名する必要があります。方法については、JSON Web Token specification を参照してください。 トークンは、自分で一から実装するのではなく、この機能を標準でサポートしている標準ツールまたはサードパーティライブラリを使用して構築することを推奨します。サポートライブラリの詳細については、JWT.io の一覧を参照してください。

以下の例では、Node.js スクリプトで jose package を使用してアサーションを生成します。
const { SignJWT } = require('jose')
const crypto = require("crypto");
const uuid = require("uuid");

async function main() {
 const privateKeyPEM = crypto.createPrivateKey(/**
   ここに秘密鍵の内容を読み込みます。秘密鍵は安全なインフラストラクチャに保存することをお勧めします。 
 */);

 const jwt = await new SignJWT({})
   .setProtectedHeader({ 
      alg: 'RS256', // または RS384 または PS256
      kid: '(OPTIONAL) KID_GENERATED_BY_AUTH0' 
   })
   .setIssuedAt()
   .setIssuer('CLIENT_ID')
   .setSubject('CLIENT_ID')
   .setAudience('https://YOUR_TENANT.auth0.com/') // またはカスタムドメイン
   .setExpirationTime('1m')
   .setJti(uuid.v4())
   .sign(privateKeyPEM);
  console.log(jwt)
}

main();
秘密鍵で署名されたクライアントアサーションの例:
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"
}
必要な情報を含むJWTを生成したら、Auth0 に対するアプリケーションの認証を行う準備は完了です。

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

次の例では、Client Credential Flow を使用します。Private Key JWT 認証は、client_secretclient_assertion に置き換えられる他のグラントタイプでも使用できます。
JWT アサーションを に交換するには、次のパラメーターを指定して Authentication 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'

サポート対象のエンドポイント

https://$tenant/oauth/token エンドポイントに加えて、以下の Auth0 Authentication API のエンドポイントでも、設定済みのアプリケーションで private_key_jwt 認証を使用できます。

アサーションの制限

JWT アサーションの最大長は 2048 バイトです。 アサーション内のクレームには、次の制限があります。
  • iss: 64 文字
  • sub: 64 文字
  • jti: 64 文字
  • alg: 16 文字

詳しくはこちら