正确的应用程序结构以安全地验证 Cognito JWT 令牌

Correct Application Structure to Safely Verify Cognito JWT Tokens

我正在构建一个在后端使用 API 网关和 Lambda 的 React 应用程序。我正在完成集成 Cognito 身份验证的过程。我已完成以下内容:

Generate user pool

Upon login redirect to my React application with Auth Code

Extract Auth Code and send it to Token Enpoint

Receive back the id, access and refresh JWT tokens

我在 post 中详细介绍了所有内容:AWS Cognito Notes

我感到困惑的是验证 JWT 令牌签名的概念。 AWS 文档在此处描述了如何执行此操作:https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

简而言之,我必须下载 JSON Web 密钥,然后将其与令牌上的密钥匹配。我不清楚这如何使过程更安全。该密钥是公开可用的。如果我在进行中间人攻击,我可以简单地获取该密钥,然后将其附加到我的假 JWT 令牌上。

这让我觉得我对这个过程有根本性的误解。授权码和 JWT 令牌是否应该首先发送到 React 应用程序?

我是否应该将用户池重定向 URL 设置为 API 网关,并触发 Lambda 函数(包含客户端密码)以检索 JWT 令牌,然后发送JWT 令牌到 React 应用程序?但是我会遇到同样的问题,不知道令牌是否合法,我想?代币在客户那里得到验证,对吧?

如果有人对此有任何见解或可以指出一篇好文章,我将不胜感激。

您可以使用 API 网关授权器为您执行此操作。它将检查 header 中的 ID Token 并检查它是否对您的用户池有效。过期和无效的令牌将被拒绝。

您可以在此处阅读更多相关信息:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html

答案是 JWK 可以随客户端以任何容量存储。 JWK 仅 public 可用,但是 public 密钥不能用于伪造签名本身,因为只能使用私钥生成签名。

我在这里写了一篇关于这个主题的完整文章: https://ncoughlin.com/posts/verify-decode-cognito-jwt-tokens/