Quelle est la marche à suivre pour décoder et vérifier la signature d'un jeton JSON Web Token (JWT) Amazon Cognito ?

Lecture de 4 minute(s)
0

Je souhaite utiliser un groupe d'utilisateurs Amazon Cognito comme méthode d'authentification pour mon application. Quel est un moyen sécurisé de vérifier l'ID et les jetons d'accès envoyés par les clients à mon application ?

Brève description

Lorsque les clients s'authentifient à votre application avec un groupe d'utilisateurs, Amazon Cognito envoie un jeton d'ID. Vous pouvez vérifier manuellement le jeton d'identification dans des scénarios similaires à ce qui suit :

  • Vous avez créé une application web et souhaitez utiliser un groupe d'utilisateurs Amazon Cognito pour l'authentification.
  • Vous utilisez un groupe d'utilisateurs Amazon Cognito pour l'authentification et un groupe d'identités Amazon Cognito pour récupérer les informations d'identification temporaires AWS Security Token Service (AWS STS). AWS Lambda est appelé avec ces informations d'identification, mais Lambda ne dispose pas d'informations sur les personnes authentifiées à l'origine auprès du groupe d'utilisateurs.

Pour obtenir des détails utilisateur Amazon Cognito contenus dans un jeton Amazon Cognito JSON Web Token (JWT), vous pouvez décoder le jeton, puis vérifier la signature.

Résolution

AWS a publié la bibliothèque suivante que vous pouvez utiliser pour vérifier les JWT :https://github.com/awslabs/aws-jwt-verify

import { CognitoJwtVerifier } from "aws-jwt-verify";

// Verifier that expects valid access tokens:
const verifier = CognitoJwtVerifier.create({
  userPoolId: "<user_pool_id>",
  tokenUse: "access",
  clientId: "<client_id>",
});

try {
  const payload = await verifier.verify(
    "eyJraWQeyJhdF9oYXNoIjoidk..." // the JWT as string
  );
  console.log("Token is valid. Payload:", payload);
} catch {
  console.log("Token not valid!");
}

Une fois qu'un utilisateur se connecte, un groupe d'utilisateurs Amazon Cognito renvoie un JWT. Le JWT est une chaîne JSON codée en base64url (« claims ») qui contient des informations sur l'utilisateur. Amazon Cognito renvoie trois jetons : le jeton ID, le jeton d'accès et le jeton d'actualisation. Le jeton ID contient les champs utilisateur définis dans le groupe d'utilisateurs Amazon Cognito.

Les jetons comprennent trois sections : un en-tête, une charge utile et une signature.

Voici l'en-tête d'un exemple de jeton d'ID. L'en-tête contient l'ID de clé (« kid »), ainsi que l'algorithme (« alg ») utilisé pour signer le jeton. Dans cet exemple, l'algorithme est « RS256 », qui est une signature RSA avec SHA-256.

{
  "kid": "abcdefghijklmnopqrsexample=",
  "alg": "RS256"
}

Voici un exemple de la charge utile. Elle contient des informations sur l'utilisateur, ainsi que des horodatages de la création et de l'expiration du jeton :

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}

La dernière section est la signature. Il s’agit d’une combinaison hachée et cryptée de l'en-tête et de la charge utile.

Amazon Cognito génère deux paires de clés RSA pour chaque groupe d'utilisateurs. La clé privée de chaque paire est utilisée pour signer le jeton d'ID ou le jeton d'accès respectif. Les clés publiques sont disponibles à une adresse dans le format suivant :

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

Le fichier JSON (jwks.json) est structuré dans le format suivant :

{
    "keys": [{
        "alg": "RS256",
        "e": "AQAB",
        "kid": "abcdefghijklmnopqrsexample=",
        "kty": "RSA",
        "n": "lsjhglskjhgslkjgh43lj5h34lkjh34lkjht3example",
        "use": "sig"
    }, {
        "alg":
        "RS256",
        "e": "AQAB",
        "kid": "fgjhlkhjlkhexample=",
        "kty": "RSA",
        "n": "sgjhlk6jp98ugp98up34hpexample",
        "use": "sig"
    }]
}

Pour vérifier la signature d'un JWT Amazon Cognito, recherchez d'abord la clé publique avec un ID de clé correspondant à l'ID de clé dans l'en-tête du jeton. Ensuite, vous pouvez utiliser des bibliothèques, telles que aws-jwt-verify ou celles recommandées par jwt.io ou OpenID Foundation, pour valider la signature du jeton et extraire des valeurs, telles que l'expiration et le nom d'utilisateur.

En dehors de la signature, il est également conseillé de vérifier ce qui suit :

  • Le jeton n'a pas expiré.
  • L'audience (« aud ») spécifiée dans la charge utile correspond à l'ID client de l'application créé dans le groupe d'utilisateurs Amazon Cognito.

La bibliothèque aws-jwt-verify inclut ces vérifications en votre nom. Pour plus d'exemples de code sur la façon de décoder et de vérifier un JWT Amazon Cognito à l'aide de Lambda, consultez Décoder et vérifier les jetons JWT Amazon Cognito.


Informations connexes

Vérification d'un jeton web JSON

Utilisation de jetons avec des groupes d'utilisateurs

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans