簡短版本:當指向 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 的標頭名稱(最常見的是授權)。
請注意,此選項有兩個功能:
- 將特定/所有標頭轉發到您的來源
- 根據這些標頭緩存物件。
確保您了解這可能如何影響您的快取行為。您可以在以下位置閱讀更多相關資訊:根據請求頭快取內容
您可以在快取行為中配置另一個選項,我幾乎總是使用它:Object Caching
。您可以將物件快取設定為Use Origin Cache Headers
應用程式可以控制回應快取的方式。此設定可能可用或無法使用,具體取決於您的來源 (S3/ALB/EC2) 和/或您的Cache Based on Selected Request Headers
值。
希望這會有所幫助。