Cloudfront 使用 JSON Web Token 破坏身份验证

Cloudfront 使用 JSON Web Token 破坏身份验证

简短版本:当指向 Cloudfront 后面的域时,我的 jwt 令牌无法通过刷新。

不确定这是否最好发布在这里或 stackoverflow 上,但因为我认为我已将问题隔离到 AWS Cloudfront,所以我想从这里开始。


我的设置:

  • Route 53 DNS 设置指向 Cloudfront 分发
  • 1 Cloudfront 行为获取 api/* 流量并将其发送到 ELB EC2 实例托管节点/express 应用程序
  • 1 Cloudfront 行为接收默认流量并将其发送到 Vue 单页应用文件所在的 s3 存储桶
  • Node/express 应用程序使用 Passport.js 进行 JWT 策略身份验证
    • Elastic Beanstalk

在我的本地,一切都很完美。当我在临时站点上运行并访问我的个人资料页面时,所有用户数据都会填写在相应的字段中。当我刷新页面时,JWT 令牌会发生一些问题,所有用户数据都会丢失。这也发生在身份验证后的其他页面上。

我没有将我的 api 调用指向 staging(位于 cloudfront 后面),而是尝试将我的 api 直接指向我的 ec2 实例,一切都运行正常。

那么,当问题局限于 Cloudfront 时,我需要做什么(我是否需要转发某些标头)才能每次成功传递 JWT 令牌?

答案1

如果您在标头中发送 JWT,那么您的假设是正确的,您必须告诉 CloudFront 将标头转发到原点。可以通过将Cache Based on Selected Request Headers缓存行为中的选项更改为以下值之一来实现:

  • 全部。这会将所有标头转发到原点;
  • 白名单。然后,您可以添加用于发送 JWT 的标头名称(最常见的是 Authorization)。

请注意,此选项具有两个功能:

  1. 将特定/所有标头转发到您的来源
  2. 根据这些标题来缓存对象。

确保你了解这可能会如何影响你的缓存行为。你可以在以下网址阅读更多相关信息:根据请求标头缓存内容

您可以在缓存行为中配置另一个选项,我几乎总是使用它:Object Caching。您可以将对象缓存设置为Use Origin Cache Headers这样您的应用程序可以控制响应缓存。此设置可能可用或不可用,具体取决于您的来源(S3/ALB/EC2)和/或您的Cache Based on Selected Request Headers值。

希望这会有所帮助。

相关内容