AWS ApiGateway Lambda 代理访问授权方
AWS ApiGateway Lambda Proxy access Authorizer
我在我的 ApiGateway 中使用 Lambda 代理和 Cognito 用户池授权方。在 Lambda 函数中,我可以通过事件对象访问路径等变量。除此之外,我还想访问经过身份验证的用户的声明。在文档中写道,我应该使用:
context.authorizer.claims.property
但是我的授权人是空的所以我得到
Cannot read property 'claims' of undefined
有人有想法吗?
如果您指的是 this part of the documentation,$context.authorizer.claims
是集成映射模板的一部分。它与处理程序的 context
参数无关。
使用 Lambda Proxy integration
,您正在使用 passthrough mapping template
。 i̶t̶s̶s̶e̶e̶e̶m̶s̶w̶h̶h̶a̶t̶i̶t̶t̶您可能必须禁用 Lambda Proxy integration
并在映射模板中使用类似这样的内容:
{
"identity" : {
"sub" : "$context.authorizer.claims.sub",
"email" : "$context.authorizer.claims.email"
}
}
映射模板 "build" Lambda 的 event
参数。因此,您将能够通过 event
参数访问您声明的部分内容。
exports.handler = (event, context, callback) => {
// TODO implement
callback(null, event.identity.email);
};
请注意,我稍微修改了文档示例以避免对 context
可以是什么的另一个混淆:
- API 网关中的映射模板变量
- Lambda 中处理程序的第二个参数
- 文档的某些示例中
event
参数的一个键 <= 我重命名了它 identity
编辑
正如 doorstuck、the information is available using the proxy integration
所指出的
接受的答案可以,但不是必需的。使用 Lambda 代理集成时,您可以访问授权方声明:
event.requestContext.authorizer.claims
您可以尝试 console.log(event);
并在 CloudWatch Logs 中查看您从 Lambda 代理集成中获得的信息。
确保您发送“身份令牌”作为授权header,而不是“访问令牌”。
Documentation for Identity Token
例如,我正在使用 Amplify 并通过以下方式获取访问令牌:
userSession.getAccessToken().getJwtToken() // Wrong
而不是
userSession.getIdToken().getJwtToken() // Correct
我在我的 ApiGateway 中使用 Lambda 代理和 Cognito 用户池授权方。在 Lambda 函数中,我可以通过事件对象访问路径等变量。除此之外,我还想访问经过身份验证的用户的声明。在文档中写道,我应该使用:
context.authorizer.claims.property
但是我的授权人是空的所以我得到
Cannot read property 'claims' of undefined
有人有想法吗?
如果您指的是 this part of the documentation,$context.authorizer.claims
是集成映射模板的一部分。它与处理程序的 context
参数无关。
使用 Lambda Proxy integration
,您正在使用 passthrough mapping template
。 i̶t̶s̶s̶e̶e̶e̶m̶s̶w̶h̶h̶a̶t̶i̶t̶t̶您可能必须禁用 Lambda Proxy integration
并在映射模板中使用类似这样的内容:
{
"identity" : {
"sub" : "$context.authorizer.claims.sub",
"email" : "$context.authorizer.claims.email"
}
}
映射模板 "build" Lambda 的 event
参数。因此,您将能够通过 event
参数访问您声明的部分内容。
exports.handler = (event, context, callback) => {
// TODO implement
callback(null, event.identity.email);
};
请注意,我稍微修改了文档示例以避免对 context
可以是什么的另一个混淆:
- API 网关中的映射模板变量
- Lambda 中处理程序的第二个参数
- 文档的某些示例中
event
参数的一个键 <= 我重命名了它identity
编辑
正如 doorstuck、the information is available using the proxy integration
所指出的接受的答案可以,但不是必需的。使用 Lambda 代理集成时,您可以访问授权方声明:
event.requestContext.authorizer.claims
您可以尝试 console.log(event);
并在 CloudWatch Logs 中查看您从 Lambda 代理集成中获得的信息。
确保您发送“身份令牌”作为授权header,而不是“访问令牌”。
Documentation for Identity Token
例如,我正在使用 Amplify 并通过以下方式获取访问令牌:
userSession.getAccessToken().getJwtToken() // Wrong
而不是
userSession.getIdToken().getJwtToken() // Correct