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

Posted

技术标签:

【中文标题】我是不是需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌?【英文标题】:Do I need to verify a AWS Cognito token in BOTH Lambda AND as API Gateway?我是否需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌? 【发布时间】:2019-06-08 18:03:36 【问题描述】:

在 lambda 中使用来自 JWT 令牌的 AWS Cognito 属性时,是否需要验证 JWT? Lambda 仅由已验证令牌的 API 网关触发。

添加细节: - 我在 API Gateway 中使用 Cognito Authorizer 来验证令牌。 - lambda 作为代理连接到 API 网关。

【问题讨论】:

【参考方案1】:

不,如果受 API Gateway 的custom lambda authorizer 保护,您不需要在后端 lambda 中验证 JWT。我建议您使用基于请求的 lambda 授权器并附加 attributes in the response。因此,您的后端 lambda 将能够访问 event.requestContext.authorizer['your_attribue'] 中的属性。

这也将使您能够单独测试您的 Lambda,而无需从 JWT 获取属性。您始终可以模拟 event 对象进行单元测试。

【讨论】:

谢谢。我在 API GW 中使用 cognito 授权器,而不是自定义 lambda 授权器,这有什么不同吗? 抱歉,我只是假设您使用的是自定义授权,因为您提到了 JWT。据我所知,在使用基于 IAM_ROLE 的授权调用者提交访问密钥或提交签名请求时。无论如何,您的 lambda 集成都不需要验证用户发出的请求。【参考方案2】:

我遇到了同样的难题,并试图找到记录确认,在 Lambda 中,我不必自己进行任何验证,并且我可以安全地依赖令牌/声称是真实的。不幸的是,到目前为止,我所看到的 AWS 文档或论坛帖子中没有任何内容明确证实了这一点。

但我确实为 GCP 找到了类似的东西,以及那里的 API 网关如何验证 JWT。来自GCP documentation:

要对用户进行身份验证,客户端应用程序必须发送 JSON Web 发送给您的 HTTP 请求的授权标头中的令牌 (JWT) 后端 API。 API Gateway 代表您的 API 验证令牌,因此 您不必在 API 中添加任何代码来处理 身份验证。 但是,您确实需要配置 API 配置 您的网关以支持您选择的身份验证方法。

API Gateway 使用 JWT 以高效的方式验证 JWT 颁发者的 JSON Web 密钥集 (JWKS)。 JWKS 的位置是 在网关 API 配置的 x-google-jwks_uri 字段中指定。 API Gateway 将 JWKS 缓存 5 分钟,并每隔一段时间刷新一次 五分钟。

因此,至少在 GCP 中,我们似乎不需要做任何事情,API 网关会处理所有事情。尽管这并不能证实它在 AWS 中也是如此工作的,但事实上它在 GCP 中就是这样工作的,这让我更有信心假设它在 AWS 中也必须如此。

【讨论】:

以上是关于我是不是需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON 格式将 lambda 请求 ID 记录到 AWS CloudWatch Api 网关日志组中?

如何在 Node.js 中使用带有 API 网关的 AWS Lambda 发送二进制响应? [复制]

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

AWS Lambda + NAT 网关的替代方案

闲置时,带有 Lambda 的 API 网关在第一次调用时返回 404?

如何使用 AWS API 网关和 Lambda 通过 CORS?