Comment décoder et vérifier la signature d'un jeton web JSON Amazon Cognito ?

Date de la dernière mise à jour : 14/09/2020

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'ID dans des scénarios similaires aux suivants :

  • 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 les détails de l'utilisateur Amazon Cognito contenus dans un jeton web JSON (JWT) Amazon Cognito, vous pouvez les décoder, puis vérifier la signature. Pour obtenir des exemples de code présentant la méthode pour décoder et vérifier un JWT Amazon Cognito à l'aide d'AWS Lambda, consultez Décodage et vérification des jetons JWT Amazon Cognito sur le site web GitHub.

Résolution

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 Base64 qui contient des informations sur l'utilisateur (appelées revendications). 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 celles recommandées par jwt.io ou OpenID Foundation, pour valider la signature du jeton et extraire les valeurs comme 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.

Pour obtenir des exemples de code présentant la méthode pour décoder et vérifier un JWT Amazon Cognito à l'aide d'AWS Lambda, consultez Décodage et vérification des jetons JWT Amazon Cognito.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?