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?
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.
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
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