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

如何在Serverless框架下从受Cognito授权器保护的Lambda中获取用户数据

解决Lambda中获取Cognito授权用户数据的问题

我明白你现在遇到的问题——用Cognito用户池授权器保护Lambda后,想拿到用户ID作为DynamoDB的键,但之前尝试event.request.userAttributes没生效。这是因为API Gateway的Cognito授权器并不会把用户数据放在event.request里,而是存放在另一个路径下。

正确的用户数据获取路径

当API Gateway通过Cognito用户池授权器验证用户身份后,用户的核心信息(包括唯一用户ID sub、邮箱、昵称等)会被封装到Claims中传递给Lambda的事件对象,具体路径分两种情况:

  • 如果你用的是REST API(API Gateway v1):数据在 event.requestContext.authorizer.claims
  • 如果你用的是HTTP API(API Gateway v2):数据在 event.requestContext.authorizer.jwt.claims

修改后的示例代码

下面是适配REST API的代码,你可以根据自己的API类型调整路径:

module.exports.helloprotected = (event, context, callback) => {
  // 获取Cognito用户池中的唯一用户ID(sub字段是用户的核心标识)
  const userId = event.requestContext.authorizer.claims.sub;
  // 示例:获取用户邮箱(如果你的用户池配置了邮箱属性并收集了该信息)
  const userEmail = event.requestContext.authorizer.claims.email;

  // 这里就可以用userId作为DynamoDB的主键进行读写操作了
  console.log(`当前访问用户ID: ${userId}`);

  // 返回包含用户信息的响应示例
  callback(null, {
    statusCode: 200,
    body: JSON.stringify({
      message: "成功访问受保护资源",
      userId: userId,
      userEmail: userEmail
    })
  });
};

额外注意事项

  1. Serverless.yml配置检查:确保你的函数的HTTP事件正确关联了Cognito授权器,示例配置如下:
functions:
  helloprotected:
    handler: handler.helloprotected
    events:
      - http:
          path: protected
          method: get
          authorizer:
            type: COGNITO_USER_POOLS
            # 替换成你的授权器ID或者ARN
            authorizerId: !Ref YourCognitoUserPoolAuthorizer
  1. Claims字段可用性:用户Claims里的字段取决于你在Cognito用户池配置中启用的属性,比如email需要用户池开启邮箱属性并要求用户填写。

内容的提问来源于stack exchange,提问作者sigmaxf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:23:33