亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法從 Go API 在客戶端中設置 cookie

無法從 Go API 在客戶端中設置 cookie

Go
眼眸繁星 2022-10-24 15:51:58
我有一個用 Go 編寫的后端,托管在 Heroku 上,我們稱之為https://foo.herokuapp.com. 我有一個托管在不同域上的前端,我們稱之為https://ui.example.com. 后端 API 有一個端點/api/user/login,它以 cookie 的形式發回 JSON Web Token,如下所示:http.SetCookie(w, &http.Cookie{        Name:     "token",        Value:    token, // the JWT        HttpOnly: false, // for testing, set to true later once I fix this        MaxAge:   int(time.Hour * 24 * 3),        Expires:  time.Now().UTC().Add(time.Hour * 24 * 3),        Path:     "/",        Secure:   true,        SameSite: http.SameSiteNoneMode,})這些是我在服務器上的 CORS 設置。crossOrigin := cors.New(cors.Options{        AllowedOrigins:   []string{allowedOrigin},        AllowCredentials: true,        AllowedMethods:   []string{http.MethodGet, http.MethodPost, http.MethodPut},})前端向后端發出請求,如下所示。const endpoint = "/api/user/login/"    fetch(host + endpoint, {        method: "POST",        credentials: 'include',        body: JSON.stringify({            email,            password        })    }).then((response) => console.log(response))    .catch((err) => console.log(err));問題: 現在這個 cookie 實際上在我的瀏覽器的網絡選項卡中可見。但是 cookie 不存在于應用程序選項卡(或存在 cookie 的 Firefox 中的存儲選項卡)中。瀏覽器沒有保存 cookie,這導致后續請求失敗,因為 cookie 中的令牌在處理實際請求之前已經過驗證和解碼。在另一個相關的線程中,我知道 Heroku 在到達我的應用程序之前終止了 SSL。并且,因此無法為非 SSL 流量設置安全 cookie。那里的解決方案建議信任X-Forwarded-For. 我使用https://github.com/gorilla/handlers包啟用了它,如下所示。// srv is my actual handler// crossOrigin is the CORS middleware// finally wrapped by ProxyHeaders middlewarehandlers.ProxyHeaders(crossOrigin.Handler(srv))然而這是行不通的。我讀了很多線程/博客。到目前為止沒有任何效果。我究竟做錯了什么?
查看完整描述

1 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

Cookies 由瀏覽器為首先設置 cookie 的域保存。只是因為您在“應用程序”選項卡中看不到 cookie,并不意味著 cookie 沒有保存。


如果您的前端https://ui.example.com對 XHR 進行了調用https://foo.herokuapp.com并且該調用返回了一個Set-Cookie標頭,則瀏覽器將該 cookie 保存在foo.herokuapp.com域下。您不會在ui.example.com“應用程序”選項卡中看到它。盡管如此,當您再次調用 XHR 時foo.herokuapp.com,瀏覽器將發送您之前設置的 cookie。


您可以進行此實驗:登錄后,打開一個新選項卡并導航到https://foo.herokuapp.com. 現在打開應用程序選項卡,您應該會在那里看到您的 cookie。


也就是說,請記住瀏覽器會將這些 cookie 視為 3rd 方 cookie,并且瀏覽器供應商最終將放棄對 3rd 方 cookie 的支持。最終,您應該確保您的前端和后端服務來自同一個父域。


至于另一個問題 - Heroku 在其網關和您的應用程序之間終止 SSL 不是問題。cookie 上的secure標志是瀏覽器的信息 - 瀏覽器不會通過非 SSL 連接接受或發送帶有此標志的 cookie。您的瀏覽器和 heroku 服務器之間的連接是 SSL,因此 cookie 將被接受/發送。在您的后端,cookie 只是 HTTP 標頭,后端并不真正關心 cookie 的標志或連接類型。


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號