Авторизованный пул пользователя Cognito с безсерверной платформой

Мне нужно авторизовать мою конечную точку API с помощью aws cognito userpool. Я могу сделать это вручную, но мне нужно автоматизировать часть авторизации с помощью серверной платформы.

Есть ли в Serverless Framework поддержка aws cognito?

Если это так, как мы можем настроить пул пользователей без сервера?

Ответ 1

Да. Безсерверная (v1.5) поддержка авторизованного пула пользователей Cognito.

Если вы используете предыдущую версию serverless, вам необходимо обновить v1.5 или новее.

Для авторизации конечного пункта api для пула пользователей вам необходимо указать пул arn.

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
          integration: lambda
          authorizer:
            name: authorizer
            arn: arn:aws:cognito-idp:us-east-1:123456789:userpool/us-east-1_XXXXXX

Подробнее читайте эту статью.

Ответ 2

Если вы хотите установить для авторизатора Cognito User Pool, который вы объявили в своих ресурсах, вы должны также использовать CloudFormation для создания авторизатора.

functions:
  functionName:
    # ...
    events:
      - http:
          # ...
          authorizer: 
             type: COGNITO_USER_POOLS
             authorizerId: 
               Ref: ApiGatewayAuthorizer

resources:
  Resources:
    ApiGatewayAuthorizer: 
      Type: AWS::ApiGateway::Authorizer
      Properties: 
        Name: CognitoUserPool
        Type: COGNITO_USER_POOLS
        IdentitySource: method.request.header.Authorization
        RestApiId: 
          Ref: ApiGatewayRestApi
        ProviderARNs: 
          - Fn::GetAtt:
              - UserPool
              - Arn

    UserPool:
      Type: AWS::Cognito::UserPool

Ответ 3

Без сервера 1.35.1

На случай, если кто-то наткнется на это, как я. Вот мое рабочее решение.

Куда бы вы ни создавали пул пользователей, вы можете добавить ApiGatewayAuthorizer

# create a user pool as normal
CognitoUserPoolClient:
  Type: AWS::Cognito::UserPoolClient
  Properties:
    # Generate an app client name based on the stage
    ClientName: ${self:custom.stage}-user-pool-client
    UserPoolId:
      Ref: CognitoUserPool
   ExplicitAuthFlows:
   - ADMIN_NO_SRP_AUTH
   GenerateSecret: true

# then add an authorizer you can reference later
ApiGatewayAuthorizer:
  DependsOn:
  # this is pre-defined by serverless
  - ApiGatewayRestApi
  Type: AWS::ApiGateway::Authorizer
  Properties:
    Name: cognito_auth
    # apparently ApiGatewayRestApi is a global string
    RestApiId: { "Ref" : "ApiGatewayRestApi" }
    IdentitySource: method.request.header.Authorization
    Type: COGNITO_USER_POOLS
    ProviderARNs:
    - Fn::GetAtt: [CognitoUserPool, Arn]

Затем, когда вы определяете свои функции

graphql:
  handler: src/app.graphqlHandler
  events:
  - http:
    path: /
    method: post
    cors: true
    integration: lambda
    # add this and just reference the authorizer
    authorizer:
      type: COGNITO_USER_POOLS
      authorizerId:
        Ref: ApiGatewayAuthorizer