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

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

Поддерживает ли бессерверный фреймворк awsognito?

Если да, то как нам настроить aws-userpool без сервера?




Ответы (3)


Да . Бессерверная (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

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

person Niroshan Ranapathi    schedule 15.01.2017
comment
просто примечание, вам не нужно обновляться до версии 1.5, вы можете использовать настраиваемый авторизатор serverless.com/framework/docs/providers/aws/events/ для этого вам нужно создать свой авторизатор, который будет использовать пул пользователей, это также может помочь aws.amazon.com/pt/ блоги / compute / - person dege; 16.01.2017
comment
Спасибо за ваши предложения. Но без сервера эта функция появилась в версии 1.5. - person Niroshan Ranapathi; 16.01.2017
comment
да, я знаю :) Я предлагал на всякий случай, если кто-то использовал старую версию serverless до v1.5 - person dege; 16.01.2017
comment
нужно ли мне это изменить? Если вы используете предыдущую версию serverless, вам необходимо обновить v1.5 или новее - person Niroshan Ranapathi; 16.01.2017
comment
Нет необходимости, я думаю, понятно, что ваш ответ за 1.5, хотел просто дополнить :) - person dege; 17.01.2017
comment
@NiroshanRanapathi Как установить авторизатор для пула пользователей Cognito, который вы объявляете в разделе ресурсов вашего serverless.yml? - person Resist Design; 03.05.2018
comment
Как я могу получить возврат претензий от id_token? Можно ли пройти assess_token кроме id_token? - person BartusZak; 11.07.2019
comment
@NiroshanRanapathi Я предполагаю, что бессерверный тип может определить тип по номеру ARN, но мне не ясно, почему определяется источник. В консоли API Gateway это поле обязательно для заполнения. - person Omnibyte; 20.05.2020
comment
несмотря на то, что ошибки не было, этот фрагмент не создавал новый Authorizer после развертывания. Я использовал ответ @Dehli ниже, который сработал для меня. - person Omnibyte; 27.05.2020
comment
как мы сопоставляем атрибуты когнитивных данных в шаблоне сопоставления запросов или перенаправляем эти атрибуты в качестве входных данных в лямбда. - person Dharmendra Singh Negi; 12.11.2020

Если вы хотите установить авторизатор для пула пользователей Cognito, который вы объявили в своих ресурсах, вы также должны использовать 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
person Dehli    schedule 12.06.2018

Бессерверная версия 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
person sevensevens    schedule 28.04.2019