Авторизованный пул пользователя 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