Vérification d'un jeton web JSON - Amazon Cognito

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Vérification d'un jeton web JSON

Ces étapes décrivent la vérification d'un jeton web JSON (JWT) de groupe d'utilisateurs.

Prérequis

Les tâches décrites dans cette section sont peut-être déjà traitées par votre bibliothèque, votre kit SDK ou votre infrastructure logicielle. AWS Les SDK fournissent des outils pour le traitement et la gestion des jetons du pool d'utilisateurs Amazon Cognito dans votre application. AWS Amplify inclut des fonctions permettant de récupérer et d'actualiser les jetons Amazon Cognito.

Pour plus d'informations, consultez les pages suivantes.

De nombreuses bibliothèques sont disponibles pour le décodage et la vérification d'un jeton web JSON (JWT). De telles bibliothèques peuvent être utiles si vous voulez traiter manuellement des jetons pour le traitement d'API côté serveur, ou si vous utilisez d'autres langages de programmation. Consultez la liste de bibliothèques OpenID Foundation pour la gestion des jetons JWT.

Validez les jetons avec aws-jwt-verify

Dans une application Node.js, AWS recommande à la aws-jwt-verifybibliothèque de valider les paramètres du jeton que l'utilisateur transmet à votre application. Avec aws-jwt-verify, vous pouvez renseigner un CognitoJwtVerifier avec les valeurs des champs standard que vous souhaitez vérifier pour un ou plusieurs groupes d'utilisateurs. Parmi les valeurs qu'il peut vérifier figurent les suivantes :

Pour plus d'informations et des exemples de code que vous pouvez utiliser dans une application Node.js ou un AWS Lambda autorisateur, reportez-vous aws-jwt-verifyà la section suivante. GitHub

Comprendre et inspecter les jetons

Avant d'intégrer l'inspection des jetons à votre application, réfléchissez à la manière dont Amazon Cognito assemble les jetons JWT. Récupérez des exemples de jetons de votre groupe d'utilisateurs. Décodez et examinez-les en détail pour comprendre leurs caractéristiques et déterminer ce que vous souhaitez vérifier et à quel moment. Par exemple, vous pouvez examiner l'appartenance à un groupe dans un scénario et les étendues dans un autre.

Les sections suivantes décrivent un processus permettant d'inspecter manuellement les jetons JWT Amazon Cognito lorsque vous préparez votre application.

Vérification de la structure du jeton JWT.

Un jeton Web JSON (JWT) comprend trois sections séparées par un séparateur . (point).

En-tête

L'ID de clé, kid, et l'algorithme RSA, alg, utilisés par Amazon Cognito pour signer le jeton. Amazon Cognito signe les jetons avec un alg ayant pour valeur RS256.

Charge utile

Champs standard du jeton. Dans un jeton d'identification, les champs standard incluent des attributs de l'utilisateur et des informations sur le groupe d'utilisateurs, iss, et le client d'application, aud. Dans un jeton d'accès, la charge utile inclut les étendues, l'appartenance à un groupe, votre groupe d'utilisateurs en tant que iss, et votre client d'application en tant que client_id.

Signature

La signature n'est pas décodable en base64 comme l'en-tête et la charge utile. Il s'agit d'un identifiant RSA256 dérivé d'une clé de signature et de paramètres que vous pouvez observer sur votre URI JWKS.

L'en-tête et la charge utile sont au format JSON codé en base64. Vous pouvez les identifier grâce aux premiers caractères eyJ dont la forme déchiffrée correspond au caractère ouvrant {. Si l'utilisateur présente un jeton JWT codé en base64 à votre application et qu'il n'est pas au format [JSON Header].[JSON Payload].[Signature], ce n'est pas un jeton Amazon Cognito valide et vous pouvez l'ignorer.

Validation du jeton JWT

La signature du jeton JWT est une combinaison hachée de l'en-tête et de la charge utile. Amazon Cognito génère deux paires de clés de chiffrement RSA pour chaque groupe d'utilisateurs. Une clé privée signe les jetons d'accès et l'autre signe les jetons d'identification.

Pour vérifier la signature d'un jeton JWT
  1. Décodez le jeton d'identification.

    OpenID Foundation gère également une liste de bibliothèques pour la gestion des jetons JWT.

    Vous pouvez également l'utiliser AWS Lambda pour décoder les JWT du groupe d'utilisateurs. Pour plus d'informations, consultez Décoder et vérifier les jetons Amazon Cognito JWT à l'aide de. AWS Lambda

  2. Comparez l'ID de clé local (kid) à l'identifiant kid public.

    1. Téléchargez et stockez la clé web JSON (JWK) publique correspondante pour votre groupe d'utilisateurs. Elle est disponible dans le cadre d'un ensemble de clés web JSON (JWKS). Vous pouvez le localiser en construisant l'URI jwks_uri suivant pour votre environnement :

      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json

      Pour plus d'informations sur les clés JWK et les ensembles de clés JWK, consultez JSON Web Key (JWK).

      Note

      Amazon Cognito peut effectuer une rotation des clés de signature dans votre groupe d’utilisateurs. Une bonne pratique consiste à mettre en cache les clés publiques de votre application, en utilisant l'identifiant kid comme clé de cache, et à actualiser régulièrement le cache. Comparez l'identifiant kid dans les jetons que votre application reçoit à votre cache.

      Si vous recevez un jeton avec l'émetteur approprié, mais un identifiant kid différent, Amazon Cognito a peut-être effectué la rotation de la clé de signature. Actualisez le cache à partir du point de terminaison jwks_uri de votre groupe d'utilisateurs.

      Ceci est un exemple de fichier jwks.json :

      { "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
      ID de clé (kid)

      L'identifiant kid indique quelle clé a été utilisée pour sécuriser la signature Web JSON (JWS) du jeton.

      Algorithme (alg)

      Le paramètre d'en-tête alg indique l'algorithme de chiffrement utilisé pour sécuriser le jeton d'identification. Les groupes d'utilisateurs se servent d'un algorithme de chiffrement RS256, qui est une signature RSA avec SHA-256. Pour plus d'informations sur RSA, consultez Chiffrement RSA.

      Type de clé (kty)

      Le paramètre kty identifie la famille d'algorithmes de chiffrement utilisée avec la clé, comme « RSA » dans cet exemple.

      Exposant RSA (e)

      Le paramètre e contient la valeur d'exposant pour la clé publique RSA. Il est représenté sous la forme d'une valeur encodée en Base64urlUInt.

      Modulo RSA (n)

      Le paramètre n contient la valeur de module pour la clé publique RSA. Il est représenté sous la forme d'une valeur encodée en Base64urlUInt.

      Use (use)

      Le paramètre use décrit l'utilisation prévue de la clé publique. Dans cet exemple, la valeur use sig représente la signature.

    2. Recherchez dans la clé Web JSON publique un identifiant kid correspondant à l'identifiant kid de votre jeton JWT.

  3. Utilisez une bibliothèque JWT pour comparer la signature de l'émetteur à celle du jeton. La signature du diffuseur est dérivée de la clé publique (le modulus RSA)"n") du kid dans jwks.json qui correspond au jetonkid. Vous pouvez avoir besoin de convertir d'abord la clé JWK au format PEM. L'exemple suivant utilise le jeton JWT, la clé JWK et la bibliothèque Node.js, jsonwebtoken, pour vérifier la signature du jeton JWT :

    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

Vérification des demandes.

Pour vérifier les demandes de jeton JWT.
  1. À l'aide de l'une des méthodes suivantes, vérifiez que le jeton n'a pas expiré.

    1. Décodez le jeton et comparez le champ standard exp à l'heure actuelle.

    2. Si votre jeton d'accès inclut une aws.cognito.signin.user.admin réclamation, envoyez une demande à une API telle que GetUser. Les demandes d'API que vous autorisez avec un jeton d'accès renvoient une erreur si votre jeton a expiré.

    3. Présentez votre jeton d'accès dans une demande adressée au Point de terminaison UserInfo. Votre demande renvoie une erreur si votre jeton a expiré.

  2. La demande aud dans un jeton d'identification et la demande client_id dans un jeton d'accès doivent correspondre à l'ID de client d'application créé dans le groupe d'utilisateurs Amazon Cognito.

  3. La demande du diffuseur (iss) doit correspondre à votre groupe d'utilisateurs. Par exemple, un groupe d'utilisateurs créé dans la région us-east-1 a la valeur iss suivante :

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>.

  4. Vérifiez la demande token_use.

    • Si vous acceptez uniquement le jeton d'accès dans vos opérations de l'API web, sa valeur doit être access.

    • Si vous utilisez uniquement le jeton d'identification, sa valeur doit indiquer id.

    • Si vous utilisez des jetons d'identification et d'accès, la demande token_use doit être id ou access.

Vous pouvez désormais approuver les demandes à l'intérieur du jeton.