it-swarm.dev

AWS SAM API dengan otorisasi Cognito User Pools

Bagaimana saya bisa membuat API dengan AWS SAM yang tidak menggunakan otorisasi Cognito User Pools?

Theres AWS :: ApiGateway :: Authorizer . Tapi ...

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

sepertinya RestApiId merujuk ke API yang menggunakan otorizer ini? Tetapi dengan AWS SAM, API saya didefinisikan seperti

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

Saya tidak mengerti bagaimana cara menghubungkan mereka bersama?

11
Jiew Meng

Saya tidak yakin Anda dapat menentukan otorizer di SAM tetapi Anda dapat menyematkan Swagger dalam file SAM yang dapat melakukan ini. Ini adalah fitur baru pada 17 Februari [ ref ].

Saya jelas bukan ahli Swagger atau SAM tetapi sepertinya Anda menginginkan sesuatu seperti:

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

Referensi:

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


Sunting: Memperbaiki sintaks 2.0 Swagger untuk bagian 'keamanan', itu harus daftar.

2
John Jones

Anda sekarang dapat mereferensikan gerbang api yang dibuat secara implisit dengan 'ServerlessRestApi'. Jadi di template SAM Anda, tambahkan potongan Cloudformation biasa ini dan semuanya akan berfungsi dengan baik

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

Seperti @simones disebutkan, berikut ini akan membuat pengotorisasi Cognito User Pool (CF template).

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

Untuk melampirkannya ke metode sumber daya, berikut ini berfungsi (dalam file 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}

Kemudian, tambahkan ke metode tertentu (dalam file Swagger):

    security:
    - ApiCognitoAuthorizer: []
0
Matthew Pitts