Vérification d'un jeton JSON Web - 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 JSON Web

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

Prérequis

Il se peut que votre bibliothèque ou votre infrastructure logicielle gère déjà les tâches décrites dans cette section. SDK AWS SDKsfournissez 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 décoder et vérifier un jeton JSON Web (JWT). Si vous souhaitez traiter manuellement les jetons pour le API traitement côté serveur, ou si vous utilisez d'autres langages de programmation, ces bibliothèques peuvent vous aider. Consultez la liste des bibliothèques de la fondation OpenID pour travailler avec JWT des jetons.

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 par jeton à votre application, réfléchissez au mode d'assemblage d'Amazon Cognito. JWTs 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 Amazon Cognito lors de la préparation JWTs de votre application.

Confirmez la structure du JWT

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

En-tête

L'ID de clé et l'RSAalgorithme utilisés par Amazon Cognito pour signer le jeton. kid alg Amazon Cognito signe les jetons avec un alg ayant pour valeur RS256. kidIl s'agit d'une référence tronquée à une clé de signature RSA privée de 2048 bits détenue par votre groupe d'utilisateurs.

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 RSA256 identifiant dérivé d'une clé de signature et de paramètres que vous pouvez observer sur votre JWKSURI.

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

Validez le JWT

La JWT signature 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 RSA cryptographiques 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 JWT jeton
  1. Décodez le jeton d'identification.

    L'OpenID Foundation tient également à jour une liste de bibliothèques permettant de travailler avec JWT des jetons.

    Vous pouvez également l'utiliser AWS Lambda pour décoder le groupe d'utilisateurs. JWTs Pour plus d'informations, consultez Décoder et vérifier les jetons Amazon JWT Cognito à 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é JSON Web publique correspondante (JWK) pour votre groupe d'utilisateurs. Il est disponible dans le cadre d'un ensemble de clés JSON Web (JWKS). Vous pouvez le localiser en élaborant les éléments suivants jwks_uri URI pour votre environnement :

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

      Pour plus d'informations sur JWK et les JWK ensembles, consultez la section JSONWeb 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)

      kidIl s'agit d'un indice qui indique quelle clé a été utilisée pour sécuriser la signature JSON Web (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 utilisent un algorithme RS256 cryptographique, qui est une RSA signature avec SHA -256. Pour plus d'informationsRSA, voir la section RSACryptographie.

      Type de clé (kty)

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

      RSAexposant () e

      Le e paramètre contient la valeur de l'exposant pour la clé RSA publique. Elle est représentée sous la forme d'une valeur urlUInt codée en Base64.

      RSAmodule () n

      Le n paramètre contient la valeur du module pour la clé RSA publique. Elle est représentée sous la forme d'une valeur urlUInt codée en Base64.

      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é JSON Web publique une clé kid qui correspond kid à votreJWT.

  3. Utilisez une JWT bibliothèque pour comparer la signature de l'émetteur à celle du jeton. La signature de l'émetteur est dérivée de la clé publique (le RSA module"n") du fichier jwks.json qui correspond kid au jeton. kid Vous devrez peut-être d'abord JWK convertir le PEM format en. L'exemple suivant prend le JWT JWK et utilise la bibliothèque Node.js, jsonwebtoken, pour vérifier la signature : 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 JWT réclamations
  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 à un API like GetUser. APIles demandes 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 le cadre de vos API opérations Web, sa valeur doit êtreaccess.

    • 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.