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

Dernière mise à jour : 31/08/2020

Mon Amazon API Gateway REST API 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 ?

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 par le biais de leurs autorisations Amazon Cognito, procédez comme suit :

  1. Utilisez la console API Gateway pour établir votre pool d'utilisateurs Amazon Cognito en tant qu'autoriseur. 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 configurée en tant que ressource proxy pour votre API.
  4. Modifiez la fonction Lambda et ajoutez l'extrait de code suivant. Cet extrait de code récupère 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 vous permettre d'accéder à Amazon CloudWatch Logs et d'exécuter la assume_role commande.

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 requête cognito:roles renvoie une liste de rôles. La requête cognito:preferred_role dans le jeton d'enregistrement de l'utilisateur hérite du rôle IAM du groupe avec la valeur de priorité la plus faible. Pour récupérer cognito:preferred_role, utilisez l’extrait de code suivant :

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

Afin de vérifier que les utilisateurs peuvent exécuter Lambda avec leur rôle Amazon Cognito, procédez comme suit :

  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.