Cloudfront 使用 JSON Web Token 中斷身分驗證

Cloudfront 使用 JSON Web Token 中斷身分驗證

簡短版本:當指向 Cloudfront 後面的網域時,我的 jwt 令牌無法在刷新中倖存。

不確定這是否最好發佈在此處或 stackoverflow 上,但由於我認為我已將問題隔離到 AWS Cloudfront,所以我想我應該從這裡開始。


我的設定:

  • Route 53 DNS 設定指向 Cloudfront 分配
  • 1 Cloudfront 行為取得 api/* 流量並將其傳送至託管節點/express 應用程式的 ELB EC2 實例
  • 1 Cloudfront 行為採用預設流量並將其傳送至 Vue 單頁應用程式檔案所在的 s3 儲存桶
  • Node/express 應用程式使用 Passport.js 透過 JWT 策略進行身份驗證
    • 彈性豆莖

在我當地,一切都很完美。當我在臨時網站上運行並訪問我的個人資料頁面時,所有使用者資料都會填入相應的欄位。當我刷新頁面時,JWT 令牌會發生一些情況,並且所有使用者資料都會遺失。這種情況也發生在身份驗證後面的其他頁面上。

我沒有將 api 呼叫指向 staging(位於 cloudfront 後面),而是嘗試將 api 直接指向我的 ec2 實例,一切都運作良好。

那麼,在將問題隔離到 Cloudfront 的情況下,我需要做什麼(是否需要轉發某些標頭)才能每次成功傳遞 JWT 令牌?

答案1

如果您在標頭中發送 JWT,那麼您的假設是正確的,您必須告訴 CloudFront 將標頭轉發到來源。可以透過將Cache Based on Selected Request Headers快取行為中的選項變更為以下值之一來實現:

  • 全部。這會將所有標頭轉發到來源;
  • 白名單。然後,您可以新增用於發送 JWT 的標頭名稱(最常見的是授權)。

請注意,此選項有兩個功能:

  1. 將特定/所有標頭轉發到您的來源
  2. 根據這些標頭緩存物件。

確保您了解這可能如何影響您的快取行為。您可以在以下位置閱讀更多相關資訊:根據請求頭快取內容

您可以在快取行為中配置另一個選項,我幾乎總是使用它:Object Caching。您可以將物件快取設定為Use Origin Cache Headers應用程式可以控制回應快取的方式。此設定可能可用或無法使用,具體取決於您的來源 (S3/ALB/EC2) 和/或您的Cache Based on Selected Request Headers值。

希望這會有所幫助。

相關內容