web-dev-qa-db-fra.com

API AWS SAM avec autoriseur de pools d'utilisateurs Cognito

Comment créer une API avec AWS SAM qui effectue l'autorisation à l'aide de l'autorisateur de pools d'utilisateurs Cognito? 

Theres AWS :: ApiGateway :: Authorizer . Mais ... 

{
  "Type" : "AWS::ApiGateway::Authorizer",
  "Properties" : {
    "AuthorizerCredentials" : String,
    "AuthorizerResultTtlInSeconds" : Integer,
    "AuthorizerUri" : String,
    "IdentitySource" : String,
    "IdentityValidationExpression" : String,
    "Name" : String,
    "ProviderARNs" : [ String, ... ],
    "RestApiId" : String,
    "Type" : String
  }
}

il ressemble à RestApiId fait référence à l'API qui utilise cet autorisateur? Mais avec AWS SAM, mes API sont définies comme suit: 

Resources:
  Ec2Index:
    Type: AWS::Serverless::Function
    Properties:
      Handler: ec2/index.handler
      Runtime: nodejs6.10
      CodeUri: ./src
      FunctionName: 'ApiEc2IndexHandler'
      Description: 'List EC2 resources'
      Timeout: 30
      Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
      Events:
        Ec2Index:
          Type: Api
          Properties:
            Path: /ec2
            Method: get

Je ne comprends pas comment puis-je les associer? 

11
Jiew Meng

Je ne suis pas certain que vous puissiez spécifier un autorisateur dans SAM, mais vous pouvez incorporer Swagger dans des fichiers SAM pour le faire. C'est une nouvelle fonctionnalité à partir du 17 février [ réf ].

Je ne suis certainement pas un expert sur Swagger ou SAM, mais il semble que vous souhaitiez quelque chose comme:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple API Endpoint configured using Swagger specified inline and backed by a Lambda function
Resources:
   Ec2Index:
     Type: AWS::Serverless::Api
    Properties:
        StageName: <stage>
        DefinitionBody:
            swagger: 2.0
            info:
              title:
                Ref: AWS::StackName
            securityDefinitions:
              cognitoUserPool:
                type: apiKey,
                name: "Authorization"
                in: header
                x-Amazon-apigateway-authtype: cognito_user_pools
                x-Amazon-apigateway-authorizer:
                  type: cognito_user_pools
                  providerARNs:
                    - arn:aws:cognito-idp:${AWS::Region}:{AWS::AccountId}:userpool/<user_pool_id>
            paths:
              "/ec2":
                get:
                  security:
                    - cognitoUserPool: []
                  x-Amazon-apigateway-integration:
                    httpMethod: POST
                    type: aws_proxy
                    uri:
                      Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Ec2IndexLamb.Arn}/invocations
                  responses: {}
            swagger: '2.0'
   Ec2IndexLamb:
    Type: AWS::Serverless::Function
    Properties:
      Handler: ec2/index.handler
      Runtime: nodejs6.10
      CodeUri: ./src
      FunctionName: 'ApiEc2IndexHandler'
      Description: 'List EC2 resources'
      Timeout: 30
      Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
      Events:
        Ec2Index:
          Type: Api
          Properties:
            Path: /ec2
            Method: get

Références:

https://docs.aws.Amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html#apigateway-enable-cognito-user-pool

https://github.com/awslabs/serverless-application-model/blob/master/examples/2016-10-31/inline_swagger/template.yaml


Edit: Correction de la syntaxe Swagger 2.0 pour la section 'sécurité', il devrait s'agir d'une liste.

2
John Jones

Vous pouvez maintenant référencer la passerelle api créée implicitement avec 'ServerlessRestApi'. Donc, dans votre modèle SAM, ajoutez cette information Cloudformation régulière et tout fonctionnera correctement

ApiCognitoAuthorizer:          
  Type: AWS::ApiGateway::Authorizer
  Properties:
    IdentitySource: 'method.request.header.Authorization'
    Name: ApiCognitoAuthorizer
    ProviderARNs:
      - 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
    RestApiId: !Ref ServerlessRestApi
    Type: COGNITO_USER_POOLS
1
simones

Comme indiqué par @simones, les éléments suivants créeront l’autoriseur Cognito User Pool (modèle CF).

ApiCognitoAuthorizer:          
 Type: AWS::ApiGateway::Authorizer
 Properties:
  IdentitySource: 'method.request.header.Authorization'
  Name: ApiCognitoAuthorizer
  ProviderARNs:
   - 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
  RestApiId: !Ref ServerlessRestApi
  Type: COGNITO_USER_POOLS

Pour l'attacher à une méthode de ressource, les opérations suivantes (dans le fichier Swagger):

 securityDefinitions:
  ApiCognitoAuthorizer:
    type: apiKey
    name: Authorization
    in: header
    x-Amazon-apigateway-authtype: cognito_user_pools
    x-Amazon-apigateway-authorizer:
      type: cognito_user_pools
      providerARNs:
        - arn:aws:cognito-idp:{region}:{userpoolIdentifier}

Ajoutez ensuite à des méthodes spécifiques (dans le fichier Swagger):

    security:
    - ApiCognitoAuthorizer: []
0
Matthew Pitts