AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?

Posted

技术标签:

【中文标题】AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?【英文标题】:AWS Lambda, API gateway & Cognito: How to get the identity object in lambda function? 【发布时间】:2017-07-26 08:44:36 【问题描述】:

我正在使用以下 AWS 技术构建无服务器后端:

AWS api_gateway AWS 认知 AWS 拉姆达

在 api_gateway 中,我创建了一个 Cognito 用户池授权器,并且我使用此授权器处理对后端的所有请求。

一切正常:当用户使用无效的 JWT 令牌发出请求时,服务器会做出相应的响应。有效的 JWT 令牌执行请求的 Lambda 函数。

问题:我无法检索到identity 信息,例如accessKeyaccountIdcognitoIdentityId 等。当我通过 lambda 函数中的 context 对象访问这些变量时,所有这些变量都是 null

问题:我需要做什么才能获得identity 变量?

【问题讨论】:

***.com/questions/29928401/… 这对您有帮助吗? 我确实看过问题和答案,但似乎没有什么对我有用。 我想知道您是否缺少此处所述的主体映射。 aws.amazon.com/blogs/mobile/… 您链接的示例使用自定义授权方。我想知道是否可以使用 Cognito 用户池授权器获取登录用户的上下文。我想这是一个很常见的用例,所以我很困惑为什么它必须如此复杂!非常感谢,非常感谢任何帮助! 【参考方案1】:

Lambda 函数中的上下文对象包含来自 Lambda 的上下文。 Lambda 函数以其执行角色的身份运行,因此其上下文不会包含来自 Cognito 用户池的身份属性。

API Gateway 通过 API Gateway 中的 $context.authorizer.claims 变量公开 Cognito 用户池身份信息。要从您的 Lambda 函数中访问此信息,您必须在 API Gateway 中修改您的正文映射模板,以通过请求正文将所需数据从 $context.authorizer.claims 传递到您的 Lambda 函数。您是 Lambda 函数,然后像任何其他字段一样从请求正文中读取此信息。

可以在here 找到这方面的文档。 向下滚动到标题为“在方法上启用用户池授权者”的部分并查看步骤 7:“如果需要,选择集成请求以添加 $context.authorizer.claims ...”

【讨论】:

这仍然是正确的答案吗?因为它对我不起作用。对于任何索赔,我都会得到空值。在过去的几天里,我发现了更多像我这样的 cmets。【参考方案2】:

当您创建 Cognito 用户池时,您将创建两个 IAM 角色。您现在可以设置 API 网关以通过

传递身份信息
    授权设置为AWS_IAM 开启Invoke with caller credential

在 Lambda 中,您应该能够在上下文中获取信息。

注意:在 Cognito IAM 角色中,您需要允许 API 网关的调用权限。

【讨论】:

在我的上下文中仍然没有授权人 :(

以上是关于AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌?

使用 Lambda 授权方的 AWS Cognito 和 API 网关

使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip

如何将AWS API网关阶段指向特定的lambda函数别名?

AWS - 从公共 API 网关到 VPC 内 lambda 的路由

Twitter CRC Challenge 不适用于 AWS Lambda/API 网关