Comment autoriser les utilisateurs de l'API REST d'API Gateway à exécuter Lambda à l'aide du rôle d'exécution d'un groupe d'utilisateurs Amazon Cognito ?

Date de la dernière mise à jour : 07/10/2021

Mon REST API d'Amazon API Gateway avec l'intégration de proxy AWS Lambda dispose d'une authentification de groupe d'utilisateurs Amazon Cognito. Comment autoriser mes utilisateurs d'API à exécuter ma fonction Lambda à l'aide du rôle AWS Identity and Access Management (IAM) associé à leur groupe de groupes d'utilisateurs, au lieu du rôle d'exécution Lambda par défaut ?

Résolution

Remarque : outre les groupes d'utilisateurs Amazon Cognito, vous pouvez également configurer un groupe d'identités pour autoriser l'accès à votre API. Pour plus d'informations, consultez la rubrique Contrôle d'accès basé sur les rôles.

Avant de configurer les utilisateurs pour exécuter Lambda avec leur rôle Amazon Cognito, assurez-vous d'avoir correctement configuré les éléments suivants :

Pour permettre aux utilisateurs d'exécuter Lambda avec leurs autorisations Amazon Cognito, exécutez les opérations suivantes :

  1. Utilisez la console API Gateway pour établir votre groupe d'utilisateurs Amazon Cognito en tant que mécanisme d'autorisation. Ensuite, affectez le groupe d'utilisateurs Amazon Cognito en tant que mécanisme d'autorisation pour la méthode de votre API. Pour obtenir des instructions, consultez Intégration d'une API REST à un groupe d'utilisateurs Amazon Cognito.
  2. Ouvrez la console AWS Lambda.
  3. Choisissez la fonction Lambda qui a été configurée comme ressource proxy pour votre API.
  4. Configurez la fonction Lambda et ajoutez l'extrait de code suivant. Cet extrait de code obtient le rôle Amazon Cognito à partir des détails de l'événement, puis assume le rôle.

Remarque : pour exécuter cet extrait de code, votre rôle IAM Lambda doit disposer des autorisation pour accéder à Amazon CloudWatch Logs et à l'appel d'API AssumeRole pour exécuter la commande assume_role.

import boto3
client = boto3.client('sts')
def lambda_handler(event, context):
    role=event['requestContext']['authorizer']['claims']['cognito:roles']
    response = client.assume_role(
        RoleArn=role,
        RoleSessionName='APIrole'
    )
    print(response)
    response2api = {"statusCode": 200,"headers": { },"body": "Success"}
    return response2api

Un utilisateur peut appartenir à plusieurs groupes d'utilisateurs Amazon Cognito et chaque groupe peut avoir un rôle IAM différent. Si un utilisateur appartient à deux groupes ou plus, la demande cognito:roles renvoie une liste de rôles. La demande cognito:preferred_role dans le jeton d'ID utilisateur hérite le rôle IAM du groupe avec la valeur de priorité la plus élevée (la valeur de precedence la plus basse). Pour plus d'informations, consultez la rubrique Contrôle d'accès basé sur les rôles.

Pour obtenir cognito:preferred_role, utilisez l'extrait de code suivant :

role = event['requestContext']['authorizer']['claims']['cognito:preferred_role']

Pour vérifier que les utilisateurs peuvent exécuter Lambda avec leur rôle Amazon Cognito, exécutez les opérations suivantes :

  1. Ouvrez votre application client, puis connectez-vous au groupe d'utilisateurs Amazon Cognito en tant qu’utilisateur.
  2. Appelez votre API en utilisant le jeton d’ID que vous recevez après vous être connecté.
    Remarque : assurez-vous d'utiliser la valeur id_token des jetons renvoyés.
  3. Vérifiez que vous pouvez accéder aux mêmes ressources que celles définies dans le rôle du groupe d'utilisateurs Amazon Cognito.
  4. Vous pouvez également vérifier CloudWatch Logs pour vous assurer du assume_role succès de la commande.

Remarque : si vous utilisez un mécanisme d'autorisation Lambda API Gatewayau lieu d'un mécanisme d'autorisation de groupe d'utilisateurs pour donner l’accès à votre API, veillez à utiliser le jeton de groupe d'utilisateurs validé par le mécanisme d'autorisation. Vous devez valider le jeton avant d'assumer son rôle.