我有一个API http网关(比如说 https://example.com)与使用Cognito授权方的API REST网关集成在一起。所有这些都是为了服务于单页 React 应用程序。行为符合预期:
- 我启动了 Cognito 托管的 UI 并登录,
- 它重定向到网址 https://example.com/#id_token=123
- 如果我使用 PostMan,如果我在授权标头中传递该id_token,我可以访问该 URL。
现在我的问题是:如何在登录后自动传递标头以便访问 https://example.com?
我花了很长时间在这个上面,发现很多类似的帖子都没有答案:
- 如何使用从 Cognito 返回的代码获取 AWS 凭证?
- 如何自动链接认知令牌和 API 身份验证标头?
- AWS Cognito 托管的 UI 在 URL 中返回id_token
- 如何使 AWS Cognito(托管 UI)的redirect_uri进行身份验证?
- 在将客户端从 Cognito 重定向到 AWS API 网关时设置授权标头
- 如何处理 Lambda/API 网关 for UI 的 Cognito 身份验证重定向?
几年前我们遇到了同样的问题。我们的解决方案是创建一个代理(使用 API 网关和 Lambda),将id_token
(存储在 cookie 中)"移动"到服务器的每个请求的Authorization
标头。这很丑陋,但它奏效了。
顺便说一句,在 URL 中获取id_token
是Implicit Grant
的工作方式。但Implicit Grant
通常被认为不如Authorization Code Grant
安全。此后,我们从Implicit Grant
迁移到Authorization Code Grant
。但是,我们继续使用代理模式(再次使用 API 网关和 Lambda),如下所示。
- 将返回的
code
交换为 Cognito 用户池令牌端点上的access_token
和id_token
。将令牌存储在 DynamoDB 表中,并将session_cookie
作为分区键。将session_cookie
作为 cookie(带有HttpOnly
、Secure
和SameSite=Strict
)返回给浏览器。 - 对于来自浏览器的每个请求,使用 Cookie 在 DynamoDB 表中查找令牌,并将令牌放在
Authorization
标头中。