Comment créer une API avec AWS SAM qui effectue l'autorisation à l'aide de l'autorisateur de pools d'utilisateurs Cognito?
Theres AWS :: ApiGateway :: Authorizer . Mais ...
{
"Type" : "AWS::ApiGateway::Authorizer",
"Properties" : {
"AuthorizerCredentials" : String,
"AuthorizerResultTtlInSeconds" : Integer,
"AuthorizerUri" : String,
"IdentitySource" : String,
"IdentityValidationExpression" : String,
"Name" : String,
"ProviderARNs" : [ String, ... ],
"RestApiId" : String,
"Type" : String
}
}
il ressemble à RestApiId fait référence à l'API qui utilise cet autorisateur? Mais avec AWS SAM, mes API sont définies comme suit:
Resources:
Ec2Index:
Type: AWS::Serverless::Function
Properties:
Handler: ec2/index.handler
Runtime: nodejs6.10
CodeUri: ./src
FunctionName: 'ApiEc2IndexHandler'
Description: 'List EC2 resources'
Timeout: 30
Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
Events:
Ec2Index:
Type: Api
Properties:
Path: /ec2
Method: get
Je ne comprends pas comment puis-je les associer?
Je ne suis pas certain que vous puissiez spécifier un autorisateur dans SAM, mais vous pouvez incorporer Swagger dans des fichiers SAM pour le faire. C'est une nouvelle fonctionnalité à partir du 17 février [ réf ].
Je ne suis certainement pas un expert sur Swagger ou SAM, mais il semble que vous souhaitiez quelque chose comme:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple API Endpoint configured using Swagger specified inline and backed by a Lambda function
Resources:
Ec2Index:
Type: AWS::Serverless::Api
Properties:
StageName: <stage>
DefinitionBody:
swagger: 2.0
info:
title:
Ref: AWS::StackName
securityDefinitions:
cognitoUserPool:
type: apiKey,
name: "Authorization"
in: header
x-Amazon-apigateway-authtype: cognito_user_pools
x-Amazon-apigateway-authorizer:
type: cognito_user_pools
providerARNs:
- arn:aws:cognito-idp:${AWS::Region}:{AWS::AccountId}:userpool/<user_pool_id>
paths:
"/ec2":
get:
security:
- cognitoUserPool: []
x-Amazon-apigateway-integration:
httpMethod: POST
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Ec2IndexLamb.Arn}/invocations
responses: {}
swagger: '2.0'
Ec2IndexLamb:
Type: AWS::Serverless::Function
Properties:
Handler: ec2/index.handler
Runtime: nodejs6.10
CodeUri: ./src
FunctionName: 'ApiEc2IndexHandler'
Description: 'List EC2 resources'
Timeout: 30
Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
Events:
Ec2Index:
Type: Api
Properties:
Path: /ec2
Method: get
Références:
Edit: Correction de la syntaxe Swagger 2.0 pour la section 'sécurité', il devrait s'agir d'une liste.
Vous pouvez maintenant référencer la passerelle api créée implicitement avec 'ServerlessRestApi'. Donc, dans votre modèle SAM, ajoutez cette information Cloudformation régulière et tout fonctionnera correctement
ApiCognitoAuthorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
IdentitySource: 'method.request.header.Authorization'
Name: ApiCognitoAuthorizer
ProviderARNs:
- 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
RestApiId: !Ref ServerlessRestApi
Type: COGNITO_USER_POOLS
Comme indiqué par @simones, les éléments suivants créeront l’autoriseur Cognito User Pool (modèle CF).
ApiCognitoAuthorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
IdentitySource: 'method.request.header.Authorization'
Name: ApiCognitoAuthorizer
ProviderARNs:
- 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
RestApiId: !Ref ServerlessRestApi
Type: COGNITO_USER_POOLS
Pour l'attacher à une méthode de ressource, les opérations suivantes (dans le fichier Swagger):
securityDefinitions:
ApiCognitoAuthorizer:
type: apiKey
name: Authorization
in: header
x-Amazon-apigateway-authtype: cognito_user_pools
x-Amazon-apigateway-authorizer:
type: cognito_user_pools
providerARNs:
- arn:aws:cognito-idp:{region}:{userpoolIdentifier}
Ajoutez ensuite à des méthodes spécifiques (dans le fichier Swagger):
security:
- ApiCognitoAuthorizer: []