Comment résoudre les erreurs « 401 Non autorisé » d'un point de terminaison API REST API Gateway après avoir configuré un pool d'utilisateurs Amazon Cognito ?

Date de la dernière mise à jour : 30/03/2021

J'ai configuré mon pool d'utilisateurs Amazon Cognito en tant qu'autorisation COGNITO_USER_POOLS dans mon API REST Amazon API Gateway. Maintenant, j'obtiens des erreurs « 401 Non autorisé » dans la réponse de l'API. Comment puis-je corriger ces erreurs ?

Solution

Remarque : API Gateway peut renvoyer les erreurs 401 non autorisé pour diverses raisons. La procédure suivante explique comment résoudre les erreurs 401 liées aux mécanismes d'autorisation COGNITO_USER_POOLS uniquement.

Vérifiez la configuration de l'agent d'autorisation dans la méthode API.

1.    Dans la console API Gateway, dans le volet API, choisissez le nom de votre API.

2.    Dans le volet de navigation de gauche, sous votre API, choisissez Mécanismes d'autorisation.

3.    Vérifiez la configuration du mécanisme d'autorisation et que ce qui suit est vrai :
L'ID du pool d'utilisateurs correspond à l'émetteur du jeton.
L'API est déployée.
Le mécanisme d'autorisation fonctionne en mode Test.

Pour plus d'informations, consultez Intégration d'une API REST à un pool d'utilisateurs Amazon Cognito.

Remarque : si vous ne pouvez pas appeler votre API après avoir vérifié la configuration du mécanisme d'autorisation dans la méthode API, vérifiez la validité du jeton de sécurité.

Vérification de la validité du jeton de sécurité

Pour plus d'informations, consultez Comment décoder et vérifier la signature d'un jeton Web JSON Amazon Cognito ? Lorsque vous vérifiez la validité du jeton de sécurité, vérifiez que ce qui suit est vrai :

  • Le jeton de sécurité n'a pas expiré.
  • L'émetteur du jeton de sécurité correspond au pool d'utilisateurs Amazon Cognito configuré dans l'API.
  • Les valeurs de Jeton d'ID et la chaîne de jeton d'accès sont valides.
    Remarque : si les valeurs de chaîne sont valides, vous pouvez décoder les jetons. Si les jetons ne sont pas valides, assurez-vous qu'aucun espace n'a été ajouté dans les jetons lorsqu'ils ont été envoyés dans l'en-tête de demande.

Important : si aucune portée supplémentaire n'est configurée dans la méthode API Gateway, assurez-vous que vous utilisez un jeton d'IDvalide. Si des portées supplémentaires sont configurées dans la méthode API Gateway, vérifiez que vous utilisez un jeton d'accès valide. Pour plus d'informations, consultez Intégration d'une API REST à un pool d'utilisateurs Amazon Cognito.

Exemple de charge utile de jeton de sécurité

Id token payload:
 {
 "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
 "aud": "xxxxxxxxxxxxexample",
 "email_verified": true,
 "token_use": "id",
 "auth_time": 1500009400,
 "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
 "cognito:username": "janedoe",
 "exp": 1500013000,
 "given_name": "Jane",
 "iat": 1500009400,
 "email": "janedoe@example.com"
 }
Access token payload:
{
    "auth_time": 1500009400,
    "exp": 1500013000,
    "iat": 1500009400,
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
    "scope": "aws.cognito.signin.user.admin",
    "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "token_use": "access",
    "username": "janedoe@example.com"
}

Notez les noms d'enregistrement suivants dans l'exemple de charge utile du jeton de sécurité :

  • token_use indique le type de jeton (ID ou jeton d'accès).
  • exp indique l'heure d'expiration du jeton.
    Remarque : l'enregistrement exp est représenté en secondes de l'heure Unix (1970-01-01T0:0:0Z) jusqu'à la date et à l'heure où le jeton expire en temps universel coordonné (UTC).
  • auth_time indique quand le jeton a été émis.
  • iss indique le domaine du pool d'utilisateurs qui a émis les jetons.

Important : assurez-vous que le jeton que vous utilisez correspond au pool d'utilisateurs configuré dans la méthode API Gateway. Si vous ne parvenez toujours pas à appeler l'API, vérifiez que vous utilisez correctement l'en-tête d'autorisation.

Si vous utilisez Postman pour appeler l'API

Utilisez le mode d'autorisation Oauth 2.0 pour utiliser directement les jetons Amazon Cognito. Lorsque vous configurez le mode d'autorisation Oauth 2.0, vérifiez que ce qui suit est vrai :

  • Letype d'octroi est un code d'autorisation ou une autorisation implicite, selon votre configuration sur le client d'applications du pool d'utilisateurs.
  • L'URL de rappel correspond à l'URL redirigée configurée sur le client d'application du pool d'utilisateurs.
  • L'URL d'authentification est au format suivant :
https://mydomain.auth.us-east-1.amazoncognito.com/login

Important : remplacez mondomaine par le nom de domaine que vous utilisez pour configurer votre pool d'utilisateurs. Tâchez d'entrer la bonne région AWS dans laquelle votre API est hébergée.

  • L'ID client est l'ID de client d'application du pool d'utilisateurs.
    Remarque : si un secret client est associé au client d'applications du pool d'utilisateurs, veillez à spécifier le secret client dans l'onglet Autorisation du champ Secret du client. Si aucun secret client n'est associé au client d'application du pool d'utilisateurs, laissez vide le champ Secret client.
  • Portée est configurée comme openid.
    Remarque : la portée openid doit être également autorisée sur le client d'application du pool d'utilisateurs.
  • Le bon point de terminaison du jeton de pool d'utilisateurs Amazon Cognito est entré pour le flux de code d'autorisation.

Exemple de point de terminaison de jeton de pool d'utilisateurs Amazon Cognito

https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

Remarque : Postman peut ne pas transmettre le type de contenu requis au point de terminaison du jeton, ce qui entraîne une erreur 405. Cependant, vous ne recevez pas l'erreur 504 lorsque vous utilisez un flux implicite.