我在我的 ApiGateway 中使用 Lambda 代理和 Cognito 用户池授权器。在 Lambda 函数中,我可以通过事件对象访问路径等变量。除此之外,我还想访问经过身份验证的用户的声明。在它编写的文档中,我应该使用:
context.authorizer.claims.property
但我授权人为空,所以我得到
Cannot read property 'claims' of undefined
有人有想法吗?
我在我的 ApiGateway 中使用 Lambda 代理和 Cognito 用户池授权器。在 Lambda 函数中,我可以通过事件对象访问路径等变量。除此之外,我还想访问经过身份验证的用户的声明。在它编写的文档中,我应该使用:
context.authorizer.claims.property
但我授权人为空,所以我得到
Cannot read property 'claims' of undefined
有人有想法吗?
接受的答案将起作用,但不是必需的。使用 Lambda 代理集成时,您可以在以下位置访问授权方声明:
event.requestContext.authorizer.claims
您可以尝试console.log(event);
查看从 CloudWatch Logs 中的 Lambda 代理集成获得的信息。
如果您指的是文档的这一部分,$context.authorizer.claims
则是集成的映射模板的一部分。它与处理程序的参数无关context
。
使用Lambda Proxy integration
,您正在使用passthrough mapping template
. I̶t̶̶s̶e̶e̶m̶s̶̶w̶h̶a̶t̶̶i̶t̶̶d̶o̶e̶s̶̶n̶o̶t̶̶i̶n̶c̶l̶u̶d̶e̶̶w̶h̶a̶t̶̶y̶o̶u̶̶a̶r̶e̶̶l̶o̶o̶k̶i̶n̶g̶̶f̶o̶r̶(见编辑)。您可能必须Lambda Proxy integration
在映射模板中禁用并使用类似的东西:
{
"identity" : {
"sub" : "$context.authorizer.claims.sub",
"email" : "$context.authorizer.claims.email"
}
}
映射模板“构建”event
了 Lambda 的参数。因此,您将能够通过event
参数访问您的索赔部分。
exports.handler = (event, context, callback) => {
// TODO implement
callback(null, event.identity.email);
};
请注意,我稍微修改了文档示例,以避免再次混淆context
可能是什么:
event
<= 我将其重命名identity
编辑
正如doorstuck所指出的,可以使用代理集成获得信息。
确保您发送“身份令牌”作为授权标头而不是“访问令牌”。
例如,我正在使用 Amplify 并通过以下方式获取访问令牌:
userSession.getAccessToken().getJwtToken() // Wrong
代替
userSession.getIdToken().getJwtToken() // Correct