如何在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 }) }); };
额外注意事项
- 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
- Claims字段可用性:用户Claims里的字段取决于你在Cognito用户池配置中启用的属性,比如
email需要用户池开启邮箱属性并要求用户填写。
内容的提问来源于stack exchange,提问作者sigmaxf
相关产品推荐
相关产品推荐

