如何在CloudFormation Template中为Lambda Proxy integration添加Cognito user pool authorizer
没问题!要给你的Lambda Proxy集成的API Gateway加上Cognito User Pool认证,只需要修改现有的CloudFormation模板,添加Cognito授权器并绑定到API方法上就行。下面是一步步的具体操作:
给Lambda Proxy集成的API Gateway添加Cognito User Pool认证(CloudFormation实现)
既然你已经有现成的Cognito User Pool,我们直接在模板里引用它来配置认证逻辑,不需要重新创建。
1. 给API Gateway添加Cognito授权器
在模板的Resources区块里,新增一个AWS::ApiGateway::Authorizer资源,关联到你的现有User Pool:
"MyCognitoAuthorizer": { "Type": "AWS::ApiGateway::Authorizer", "Properties": { "Name": "MyApiCognitoAuthorizer", "Type": "COGNITO_USER_POOLS", "IdentitySource": "method.request.header.Authorization", "RestApiId": {"Ref": "MyApiGateway"}, // 替换成你模板里现有API Gateway的资源名称 "ProviderARNs": [ "arn:aws:cognito-idp:REGION:ACCOUNT_ID:userpool/YOUR_USER_POOL_ID" // 替换成你的User Pool ARN ] } }
IdentitySource指定从请求的Authorization头获取JWT令牌,这是Cognito认证的标准方式RestApiId一定要关联到你模板里已经存在的API Gateway资源ProviderARNs填你已有的Cognito User Pool的ARN,别写错了!
2. 把授权器绑定到Lambda Proxy的API方法
找到你模板里的AWS::ApiGateway::Method资源(就是那个做Lambda Proxy集成的方法,一般是ANY方法或者特定的GET/POST方法),修改它的Properties,加上授权相关配置:
"MyApiProxyMethod": { "Type": "AWS::ApiGateway::Method", "Properties": { // 保留你原来的HttpMethod、RestApiId、ResourceId等属性 "AuthorizerId": {"Ref": "MyCognitoAuthorizer"}, "AuthorizationType": "COGNITO_USER_POOLS", // 必须设成这个,指定用Cognito做授权 "Integration": { "Type": "AWS_PROXY", "IntegrationHttpMethod": "POST", "Uri": { "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyLambdaFunction.Arn}/invocations" } } } }
这里要注意,原来的AuthorizationType可能是默认的NONE,必须改成COGNITO_USER_POOLS才能触发认证校验。
3. (可选)在Lambda里获取认证用户信息
当API Gateway完成认证后,会把JWT解析后的用户信息传递给Lambda,你可以在C#代码里直接拿到这些信息做后续逻辑:
public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // 取出认证后的用户信息 var authDetails = request.RequestContext.Authorizer; if (authDetails != null) { // 比如获取用户名 var username = authDetails["claims"]?["username"]?.ToString(); context.Logger.LogLine($"当前认证用户: {username}"); } // 你的原有业务逻辑代码 return new APIGatewayProxyResponse { StatusCode = 200, Body = "认证通过!欢迎访问API" }; }
4. 别忘了重新部署API Gateway
修改完授权器和方法后,必须重新部署API Gateway才能生效。如果你的模板里已经有AWS::ApiGateway::Deployment资源,一定要确保它的DependsOn包含新增的授权器和修改后的方法:
"MyApiDeployment": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "RestApiId": {"Ref": "MyApiGateway"}, "StageName": "prod" }, "DependsOn": ["MyApiProxyMethod", "MyCognitoAuthorizer"] // 确保依赖关系正确 }
测试验证
部署完模板后,你可以这样测试:
- 从Cognito User Pool获取一个有效的JWT令牌(可以用AWS CLI、Amplify或者Postman的OAuth2流程获取)
- 调用API时,在请求头里加上
Authorization: Bearer <你的JWT令牌> - 如果令牌无效或者没带,API Gateway会直接返回401 Unauthorized
- 令牌有效时,请求会正常代理到Lambda,同时携带用户的认证信息
内容的提问来源于stack exchange,提问作者Deepan Cool
相关产品推荐
相关产品推荐

