我有一个处理由API网关触发的POST请求的Lambda函数。后者设置为通过Cognito用户池授权程序进行授权。授权有效 - 如果我传递用户的ID令牌,则处理请求,如果我没有获得401。
但是,我无法在Lambda函数中获得授权用户的身份。所有文档都让我相信它应该在上下文中,但它不是。我也无法在那里映射它。更重要的是,似乎也没有一种方法可以为给定ID标记的用户查询用户池。
我需要一个身份池来完成此任务吗?如果是这样,那怎么办?为什么API网关不会自动传递用户的身份?
答案 0 :(得分:6)
这取决于您是否在Use Lambda Proxy Integration
中为lambda选择了Integration Request
。如果您已设置,则所有令牌的声明都将在event.requestContext.authorizer.claims
上传递。
如果您不使用Lambda代理集成,则需要在Body Mapping Template
中使用Integration Request
作为lambda。具有application/json
Content-Type的示例模板是:
"context" : {
"sub" : "$context.authorizer.claims.sub",
"username" : "$context.authorizer.claims['cognito:username']",
"email" : "$context.authorizer.claims.email",
"userId" : "$context.authorizer.claims['custom:userId']"
}
当然,期望用户池中有一个名为userId的自定义属性,客户端可以读取它们。
您不能对aws cognito-idp API使用id令牌,您需要使用访问令牌。但是,如果您的lambda已获得授权,则可以使用AdminGetUser调用用户名。
答案 1 :(得分:0)
使用event.requestContext.authorizer.claims.sub
获取用户的Cognito身份sub
,这基本上是他们的ID。 这假定您正在将代理集成与API Gateway和Lambda一起使用。
这是一个使用Node的简单示例;在其他SDK中应该相似。
exports.handler = async (event, context, callback) => {
let cognitoIdentity = event.requestContext.authorizer.claims.sub
// do something with `cognitoIdentity` here
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("some data for user"),
};
return response;
};