web-dev-qa-db-fra.com

Autorisation de pool d'utilisateurs Cognito avec Framework sans serveur

Je dois autoriser mon point de terminaison API à l'aide de aws cognito userpool. Je peux le faire manuellement, mais je dois automatiser la partie autorisation avec le framework sans serveur.

Le framework Serverless prend-il en charge aws cognito?

Si oui, comment pouvons-nous configurer un aws-userpool avec serverless?

17
nusgajy

Oui . Prise en charge sans serveur ( v1.5 ) de l'autoriseur de pool d'utilisateurs Cognito.

Si vous utilisez la version précédente de serverless, vous devez mettre à jour la version 1.5 ou ultérieure.

Pour l'autorisation de pool d'utilisateurs du point de terminaison api, vous devez spécifier l'arn du pool.

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

Plus de détails lire this article.

28
Niroshan Ranapathi

Si vous souhaitez définir l'autorisateur sur un pool d'utilisateurs Cognito que vous avez déclaré dans vos ressources, vous devez également utiliser CloudFormation pour créer l'autorisateur.

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
18
Dehli

1.35.1 sans serveur

Au cas où quelqu'un tomberait sur ce que j'ai fait. Voici ma solution de travail.

Partout où vous créez le pool d'utilisateurs, vous pouvez continuer et ajouter 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]

Ensuite, lorsque vous définissez vos fonctions

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
3
sevensevens