Authentification avec clé privée JWT

Before you start

Vous devez créer une nouvelle application dans l’Auth0 Dashboard ou convertir une application existante avant de continuer. Pour en savoir plus, lisez Configurer l’authentification par clé privée JWT.

Vous devez effectuer deux étapes lorsque vous vous authentifiez avec private_key_jwt :

  1. Construire l’assertion client. Cette assertion est un jeton Web JSON signé par la clé privée lorsque vous avez généré la paire de clés. Pour savoir comment générer une paire de clés, lisez Configurer l’authentification par clé privée JWT.

  2. Utiliser l’assertion pour vous authentifier auprès d’Auth0.

Construire l’assertion

Vous pouvez utiliser l’une des trousses SDK Auth0 pour qu’elle crée une assertion automatiquement pour vous. Si vous n’utilisez pas nos trousses SDK, vous devrez créer l’assertion vous-même.

L’assertion est un jeton Web JSON (JWT) qui doit contenir les propriétés et les demandes suivantes :

  • En-tête

    • alg : L’algorithme utilisé pour signer l’assertion. L’algorithme doit correspondre à l’algorithme spécifié lors de la création de l’identifiant de l’application.

    • kid: (facultatif) Le kid de l’identifiant généré par Auth0. Le kid est créé lors de la création de l’identifiant.

  • Charge utile

    • iss: L’ID client de votre application. Vous trouverez cette valeur dans les paramètres de votre application sous Auth0 Dashboard > Applications > Applications, onglet Settings (Paramètres).

    • sub: L’ID client de votre application. Vous pouvez également trouver cette valeur dans les paramètres de votre application. Vous trouverez cette valeur dans les paramètres de votre application sous Auth0 Dashboard > Applications > Applications, onglet Settings (Paramètres).

    • aud: L’URL du locataire Auth0 ou du domaine personnalisé qui reçoit l’assertion. Par exemple : https://{yourTenant}.auth0.com/. Inclure la barre oblique finale.

    • iat (facultatif) et exp : Les affirmations « Issued At » (Émis le) et « Expiration » (expiré) sont définies sur les horodatages corrects. L’assertion client est un jeton à usage unique, et nous recommandons le délai d’expiration le plus court possible. Auth0 prend en charge un maximum de 5 minutes pour la durée de vie d’un jeton.

    • jti : Un identifiant de demande unique créé par le client. Nous recommandons d’utiliser le format UUID (Identifiant universellement unique).

Le jeton doit ensuite être signé avec la clé privée que vous avez générée lorsque vous avez créé ou configuré votre application pour l’authentification par clé privée JWT. Pour savoir comment procéder, consultez la spécification Jeton Web JSON.

Nous vous recommandons de construire le jeton à l’aide d’outils standard ou de bibliothèques tierces qui prennent en charge cette fonctionnalité dès le départ, plutôt que de l’implémenter vous-même à partir de zéro.  Pour en savoir plus sur les bibliothèques prises en charge, lisez la liste sur JWT.io.

Exemple

Dans l’exemple ci-dessous, le script Node.js utilise un jose package pour générer l’assertion :

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?

/

Exemple d’assertion client signée avec une clé privée :

private key example

Correspond à :

{
  "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?

/

Après avoir généré le jeton JWT avec les informations requises, vous êtes prêt à authentifier votre application par rapport à Auth0.

Échanger une assertion contre des jetons d’accès

Pour échanger l’assertion JWT contre un jeton d’accès, appelez le point de terminaison de jeton de l’Authentication API avec les paramètres suivants :

  • $client_assertion: Affirmation JWT

  • $resource_server_identifier : identifiant du serveur de ressources. Pour en savoir plus, lisez Enregistrer des 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?

/

Points de terminaison pris en charge

Outre le point de terminaison https://$tenant/oauth/token, les points de terminaison suivants de l’Authentication API Auth0 prennent en charge l’authentification private_key_jwt pour les applications configurées :

Limites des assertions

La longueur maximale de l’assertion JWT est de 2048 octets.

Les demandes contenues dans l’assertion sont soumises aux limites suivantes :

  • iss : 64 caractères

  • sub : 64 caractères

  • jti : 64 caractères

  • alg : 16 caractères