Utilisez des mécanismes d'autorisation API Gateway Lambda - Amazon API Gateway

Utilisez des mécanismes d'autorisation API Gateway Lambda

Un mécanisme d'autorisation Lambda (anciennement appelé mécanisme d'autorisation personnalisée) est une fonction API Gateway qui utilise une fonction Lambda pour contrôler l'accès à votre API.

Un mécanisme d'autorisation Lambda s'avère utile pour mettre en œuvre un schéma d'autorisation personnalisée qui utilise une stratégie d'authentification par jeton de porteur, telle qu'OAuth ou SAML, ou qui utilise les paramètres de demande afin de déterminer l'identité de l'appelant.

Lorsqu'un client envoie une demande à l'une de vos méthodes d'API, API Gateway appelle votre mécanisme d'autorisation Lambda, qui accepte l'identité de l'appelant comme entrée et renvoie une stratégie IAM comme sortie.

Il existe deux types de mécanismes d'autorisation Lambda :

  • Un mécanisme d'autorisation Lambda par jeton (également appelé mécanisme d'autorisation TOKEN) reçoit l'identité de l'appelant dans un jeton de porteur, par exemple un jeton web JSON ou un jeton OAuth.

  • Un mécanisme d'autorisation Lambda basé sur les paramètres de demande (également appelé mécanisme d'autorisation REQUEST) reçoit l'identité de l'appelant dans une combinaison d'en-têtes, de paramètres de chaîne de requête et de variables stageVariables et $context.

    Pour les API WebSocket, seuls les mécanismes d'autorisation basés sur des paramètres de demande sont pris en charge.

Il est possible d'utiliser une fonction AWS Lambda d'un compte AWS différent de celui dans lequel vous avez créé votre fonction de mécanisme d'autorisation Lambda. Pour plus d'informations, consultez Configuration d'un mécanisme d'autorisation Lambda entre comptes.

Pour accéder à des exemples de fonction Lambda, veuillez consulter aws-apigateway-lambda-authorizer-blueprints sur GitHub.

Flux de travail du mécanisme d'autorisation Lambda

Le schéma suivant illustre le flux de travail d'autorisation des mécanismes d'autorisation de Lambda.


                Flux de travail d'autorisation Lambda API Gateway

Flux de travail d'autorisation Lambda API Gateway

  1. Le client appelle une méthode sur une méthode d'API API Gateway, en transmettant un jeton de porteur ou des paramètres de demande.

  2. API Gateway vérifie si un mécanisme d'autorisation Lambda est configuré pour la méthode. Si c'est le cas, API Gateway appelle la fonction Lambda.

  3. La fonction Lambda authentifie l'appelant des façons suivantes :

    • En appelant un fournisseur OAuth pour obtenir un jeton d'accès OAuth

    • En appelant un fournisseur SAML pour obtenir une déclaration SAML

    • En générant une stratégie IAM basée sur les valeurs des paramètres de demande

    • En extrayant les informations d'identification d'une base de données

  4. Si l'appel aboutit, la fonction Lambda accorde l'accès en renvoyant un objet de sortie contenant au moins une stratégie IAM et un identifiant principal.

  5. API Gateway évalue la stratégie.

    • Si l'accès est refusé, API Gateway renvoie un code de statut HTTP adapté, par exemple 403 ACCESS_DENIED.

    • Si l'accès est autorisé, API Gateway exécute la méthode. Si la mise en cache est activée dans les paramètres du mécanisme d'autorisation, API Gateway met également en cache la stratégie afin qu'il ne soit pas nécessaire de rappeler la fonction du mécanisme d'autorisation Lambda.

Étapes de création d'un mécanisme d'autorisation Lambda API Gateway

Pour créer un mécanisme d'autorisation Lambda, procédez comme suit :

  1. Créez la fonction du mécanisme d'autorisation Lambda dans la console Lambda, comme décrit dans Création d'une fonction de mécanisme d'autorisation Lambda API Gateway dans la console Lambda. Vous pouvez commencer par utiliser l'un des exemples de plan, dans lequel vous personnaliserez l'entrée et la sortie à votre gré.

  2. Configurez la fonction Lambda en tant que mécanisme d'autorisation API Gateway et configurez une méthode d'API pour l'exiger, comme décrit dans Configuration d'un mécanisme d'autorisation Lambda à l'aide de la console API Gateway. Sinon, si vous avez besoin d'un mécanisme d'autorisation Lambda entre comptes, consultez Configuration d'un mécanisme d'autorisation Lambda entre comptes.

    Note

    Vous pouvez également configurer un mécanisme d'autorisation à l'aide de l'AWS CLI ou d'un kit SDK AWS.

  3. Testez votre mécanisme d'autorisation avec Postman, comme décrit dans Appelez une API avec les mécanismes d'autorisation API Gateway Lambda.

Création d'une fonction de mécanisme d'autorisation Lambda API Gateway dans la console Lambda

Avant de configurer un mécanisme d'autorisation Lambda, vous devez créer la fonction Lambda qui implémente la logique permettant d'autoriser et, si nécessaire, d'authentifier l'appelant. La console Lambda fournit un plan Python, que vous pouvez utiliser en choisissant Use a blueprint (Utiliser un plan), puis en choisissant le plan api-gateway-authorizer-python. Sinon, utilisez l'un des plans du référentiel GitHub awslabs comme point de départ.

Pour l'exemple de fonctions de mécanisme d'autorisation Lambda présenté dans cette section, qui n'appelle pas d'autres services, vous pouvez utiliser le plan AWSLambdaBasicExecutionRole intégré. Lorsque vous créez la fonction Lambda de votre mécanisme d'autorisation Lambda API Gateway, vous devez attribuer un rôle d'exécution IAM à la fonction Lambda si elle appelle d'autres services AWS. Pour créer le rôle, suivez les instructions dans Rôle d'exécution AWS Lambda.

Pour accéder à d'autres exemples de fonction Lambda, veuillez consulter aws-apigateway-lambda-authorizer-blueprints sur GitHub.

EXEMPLE : Création d'une fonction de mécanisme d'autorisation Lambda par jeton

Pour créer une fonction de mécanisme d'autorisation Lambda par jeton, entrez le code Node.js suivant dans la console Lambda et testez-le dans la console API Gateway, comme suit.

  1. Dans la console Lambda, choisissez Créer une fonction.

  2. Choisissez Créer à partir de zéro.

  3. Entrez un nom pour la fonction.

  4. Sélectionnez Créer une fonction.

  5. Copiez et collez le code suivant dans l'éditeur de code.

    // A simple token-based authorizer example to demonstrate how to use an authorization token // to allow or deny a request. In this example, the caller named 'user' is allowed to invoke // a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke // the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty // string, the authorizer function returns an HTTP 401 status code. For any other token value, // the authorizer returns an HTTP 500 status code. // Note that token values are case-sensitive. exports.handler = function(event, context, callback) { var token = event.authorizationToken; switch (token) { case 'allow': callback(null, generatePolicy('user', 'Allow', event.methodArn)); break; case 'deny': callback(null, generatePolicy('user', 'Deny', event.methodArn)); break; case 'unauthorized': callback("Unauthorized"); // Return a 401 Unauthorized response break; default: callback("Error: Invalid token"); // Return a 500 Invalid token response } }; // Help function to generate an IAM policy var generatePolicy = function(principalId, effect, resource) { var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } // Optional output with custom properties of the String, Number or Boolean type. authResponse.context = { "stringKey": "stringval", "numberKey": 123, "booleanKey": true }; return authResponse; }
  6. Choisissez Save.

  7. Dans la console API Gateway, créez une API simple, si vous n'en avez pas déjà une.

  8. Sélectionnez votre API dans la liste des API.

  9. Choisissez Authorizers (Mécanismes d'autorisation).

  10. Choisissez Créer une nouveau mécanisme d'autorisation.

  11. Entrez un nom pour le mécanisme d'autorisation.

  12. Dans le champ Type, choisissez Lambda.

  13. Sous Fonction Lambda, choisissez la région dans laquelle vous avez créé votre fonction de mécanisme d'autorisation Lambda, puis choisissez le nom de la fonction dans la liste déroulante.

  14. Laissez le champ Invoke Role (Rôle d'appel )Lambda vide.

  15. Sous Event Payload (Charge utile d'événement Lambda), choisissez Token (Jeton).

  16. Sous Token Source (Source de jeton), entrez authorizationToken.

  17. Choisissez Create (Créer), puis Grant & Create (Accorder et créer).

  18. Sélectionnez Test.

  19. Pour la valeur authorizationToken entrez allow.

  20. Sélectionnez Test.

Dans cet exemple, lorsque l'API reçoit une demande de méthode, API Gateway transmet le jeton source à cette fonction du mécanisme d'autorisation Lambda dans l'attribut event.authorizationToken. La fonction du mécanisme d'autorisation Lambda lit le jeton et agit comme suit :

  • Si la valeur du jeton est 'allow', la fonction du mécanisme d'autorisation renvoie une réponse HTTP 200 OK et une stratégie IAM qui ressemble à ce qui suit, et la demande de méthode aboutit :

    { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/" } ] }
  • Si la valeur du jeton est 'deny', la fonction du mécanisme d'autorisation renvoie une réponse HTTP 403 Forbidden et une stratégie IAM Deny qui ressemble à ce qui suit, et la demande de méthode échoue :

    { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Deny", "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/" } ] }
  • Si la valeur du jeton est 'unauthorized' ou une chaîne vide, la fonction du mécanisme d'autorisation renvoie une réponse HTTP 401 Unauthorized et l'appel de la méthode échoue.

  • Si le jeton a n'importe quelle autre valeur, le client reçoit une réponse 500 Invalid token et l'appel de la méthode échoue.

Note

Dans le code de production, vous devrez peut-être authentifier l'utilisateur avant d'accorder l'autorisation. Dans ce cas, vous pouvez également ajouter la logique d'authentification dans la fonction Lambda en appelant un fournisseur d'authentification, comme indiqué dans la documentation de ce fournisseur.

En plus de renvoyer une stratégie IAM, la fonction du mécanisme d'autorisation Lambda doit également renvoyer l'identifiant principal de l'appelant. En outre, elle peut éventuellement renvoyer un objet context qui inclut des informations supplémentaires transmissibles au backend d'intégration. Pour plus d'informations, consultez Données de sortie d'un mécanisme d'autorisation Amazon API Gateway Lambda.

EXEMPLE : Création d'une fonction de mécanisme d'autorisation Lambda par demande

Pour créer une fonction de mécanisme d'autorisation Lambda par demande, entrez le code Node.js suivant dans la console Lambda et testez-le dans la console API Gateway, comme suit.

  1. Dans la console Lambda, choisissez Créer une fonction.

  2. Choisissez Créer à partir de zéro.

  3. Entrez un nom pour la fonction.

  4. Sélectionnez Créer une fonction.

  5. Copiez et collez le code suivant dans l'éditeur de code.

    exports.handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); // A simple request-based authorizer example to demonstrate how to use request // parameters to allow or deny a request. In this example, a request is // authorized if the client-supplied HeaderAuth1 header, QueryString1 // query parameter, and stage variable of StageVar1 all match // specified values of 'headerValue1', 'queryValue1', and 'stageValue1', // respectively. // Retrieve request parameters from the Lambda function input: var headers = event.headers; var queryStringParameters = event.queryStringParameters; var pathParameters = event.pathParameters; var stageVariables = event.stageVariables; // Parse the input for the parameter values var tmp = event.methodArn.split(':'); var apiGatewayArnTmp = tmp[5].split('/'); var awsAccountId = tmp[4]; var region = tmp[3]; var restApiId = apiGatewayArnTmp[0]; var stage = apiGatewayArnTmp[1]; var method = apiGatewayArnTmp[2]; var resource = '/'; // root resource if (apiGatewayArnTmp[3]) { resource += apiGatewayArnTmp[3]; } // Perform authorization to return the Allow policy for correct parameters and // the 'Unauthorized' error, otherwise. var authResponse = {}; var condition = {}; condition.IpAddress = {}; if (headers.HeaderAuth1 === "headerValue1" && queryStringParameters.QueryString1 === "queryValue1" && stageVariables.StageVar1 === "stageValue1") { callback(null, generateAllow('me', event.methodArn)); } else { callback("Unauthorized"); } } // Help function to generate an IAM policy var generatePolicy = function(principalId, effect, resource) { // Required output: var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; // default version policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; // default action statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } // Optional output with custom properties of the String, Number or Boolean type. authResponse.context = { "stringKey": "stringval", "numberKey": 123, "booleanKey": true }; return authResponse; } var generateAllow = function(principalId, resource) { return generatePolicy(principalId, 'Allow', resource); } var generateDeny = function(principalId, resource) { return generatePolicy(principalId, 'Deny', resource); }
  6. Choisissez Save.

  7. Dans la console API Gateway, créez une API simple, si vous n'en avez pas déjà une.

  8. Sélectionnez votre API dans la liste des API.

  9. Choisissez Authorizers (Mécanismes d'autorisation).

  10. Choisissez Créer une nouveau mécanisme d'autorisation.

  11. Entrez un nom pour le mécanisme d'autorisation.

  12. Dans le champ Type, choisissez Lambda.

  13. Sous Fonction Lambda, choisissez la région dans laquelle vous avez créé votre fonction de mécanisme d'autorisation Lambda, puis choisissez le nom de la fonction dans la liste déroulante.

  14. Laissez le champ Invoke Role (Rôle d'appel )Lambda vide.

  15. Sous Event Payload (Charge utile d'événement Lambda), choisissez Request (Demande).

  16. Sous Identity Sources (Sources d'identité), ajoutez un en-tête nommé HeaderAuth1, une chaîne de requête nommée QueryString1 et une variable d'étape nommée StageVar1.

  17. Choisissez Create (Créer), puis Grant & Create (Accorder et créer).

  18. Sélectionnez Test.

  19. Sous HeaderAuth1, entrez headerValue1. Sous QueryString1, entrez queryValue1. Sous StageVar1, entrez stageValue1.

  20. Sélectionnez Test.

Dans cet exemple, la fonction du mécanisme d'autorisation Lambda vérifie les paramètres d'entrée et agit comme suit :

  • Si toutes les valeurs de paramètre obligatoires correspondent aux valeurs attendues, la fonction du mécanisme d'autorisation renvoie une réponse HTTP 200 OK et une stratégie IAM qui ressemble à ce qui suit, et la demande de la méthode aboutit :

    { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/" } ] }
  • Sinon, la fonction du mécanisme d'autorisation renvoie une réponse HTTP 401 Unauthorized et l'appel de la méthode échoue.

Note

Dans le code de production, vous devrez peut-être authentifier l'utilisateur avant d'accorder l'autorisation. Dans ce cas, vous pouvez également ajouter la logique d'authentification dans la fonction Lambda en appelant un fournisseur d'authentification, comme indiqué dans la documentation de ce fournisseur.

En plus de renvoyer une stratégie IAM, la fonction du mécanisme d'autorisation Lambda doit également renvoyer l'identifiant principal de l'appelant. En outre, elle peut éventuellement renvoyer un objet context qui inclut des informations supplémentaires transmissibles au backend d'intégration. Pour plus d'informations, consultez Données de sortie d'un mécanisme d'autorisation Amazon API Gateway Lambda.