前言
谷歌最新版本更新之后,突然發現post請求就無法攜帶cookie了,導致原本可以用sessionId做的登錄驗證頻頻提示session過期,谷歌新版本的坑,導致我們排查了好久!
問題展示圖
但是其他瀏覽器都正常
多番查找資料,各種方法例如axios.defaults.withCredentials = true;//設置axios,要求請求必須攜帶cookie,這類方法都試了一遍,但是還是無法解決,最后參考了 https://blog.csdn.net/weixin_43990297/article/details/107716124,手動設置把谷歌默認對cookie的限制關了,再重啟瀏覽器,就可以獲取cookie了,真的巨坑!
首先如果你用axios,那么先設置withCredentials為true,然后打開谷歌瀏覽器在Chrome中訪問chrome://flags/,搜索SameSite並設置為disabled即可。原因是Chrome升級到80版本之后cookie的SameSite屬性默認值由None變為Default,這也就造成了一些訪問跨域cookie無法攜帶的問題!
最終還是拿到cookie.
*官方推薦的解決方式
官方提示:
設置了與http://192.168.4.168/的跨站點資源相關聯的cookie,但沒有設置' SameSite '屬性。在未來的Chrome版本中,只有當cookie設置為“SameSite=None”和“Secure”時,才會提供跨站點請求的cookie。你可以在開發者工具下的應用>存儲> cookie查看更多細節https://www.chromestatus.com/feature/5088147346030592和https://www.chromestatus.com/feature/5633521622188032。
就是通過在后端中設置response.setHeader(“Set-Cookie”, “widget_session=abc123; SameSite=None; Secure”),即可允許第三方cookie使用,具體可以參考: https://blog.csdn.net/weixin_44269886/article/details/102459425
總結
存在即合理,SameSite的設計初衷是為了防止CSRF攻擊,大家看到就谷歌而言就得設置,如果以后其他瀏覽器也禁止cookie呢?或者用戶手動禁止cookie?所以我很早之前都跟其他人說過不要用cookie!不要用cookie!本地數據存儲sessionStorage和localStorage不香?這次項目之所以要用cookie完全是后台為了確認第一次登陸輸入賬戶密碼和第二次輸入軟token驗證是同一用戶,於是我建議改成人工手動生成SessionId在該用戶登陸輸入密碼時在response內返回(獲取需要后端授權),然后第二次驗證時前端再把該SessionId傳回去(在請求頭放入),就確保兩次登陸是同一用戶在同一個設備!
大家切記項目中遇到困難不要死揪着不放,要懂得繞彎,一個方法不行就另尋他路。