You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:41:35