samesite導(dǎo)致response set-cookie失敗

  • 場景

    第三方平臺需要內(nèi)嵌我們的管理頁面芭碍,但又不想單獨(dú)登陸我們的系統(tǒng)暴心,因此由我們通過一個(gè)默認(rèn)的賬號密碼進(jìn)行靜默登陸并重定向到第三方需要嵌入的頁面姐浮,這樣就可以通過后臺將接口調(diào)用憑證放入cookie中(我們的接口憑證信息放在cookie中珠增,請求時(shí)校驗(yàn))超歌。

  • 問題

    實(shí)際開發(fā)中發(fā)現(xiàn)在chrome瀏覽器下實(shí)現(xiàn)存在重定向后的頁面無法獲取cookie的情況

  • 實(shí)現(xiàn)過程

    流程如下:
    1.創(chuàng)建兩個(gè)項(xiàng)目蒂教,分別作為我們的平臺(project A) 和 第三方平臺 (project B)巍举。
    2.project A 只放一個(gè)index.html頁面,內(nèi)部通過iframe嵌套project B的頁面凝垛。
    樣例:

      <iframe src="http://localhost:8081/third/logon/login?param=eyJhY2NvdW50IjoiYWRtaW4iLCJwYXNzd29yZCI6InF3ZTEyMyIsInJvbGVDZCI6InN5c3RlbSIsInNvdXJjZSI6IjEifQ==" style="width: 100%;height: 1000px">
      </iframe>
    

    這是一個(gè)重定向的接口地址懊悯,參數(shù)為加密后的信息。
    3.通過projecet A接口重定向到projecet A的展示頁梦皮。

    后端的代碼部分:

        public void login(ThirdLoginCrmLoginRequest request, HttpServletResponse response) throws Exception {
          //模擬登陸
          JSONObject result = RestTemplateUtils.postForEntity(loginUrl, initLoginParam(request));
          if (result.getInteger("code") == 200) {
              //response 設(shè)置 cookie炭分,
              ResponseCookie cookie = ResponseCookie.from("tk", result.getJSONObject("properties").getString("accessToken")) // key & value
                      .httpOnly(true)     // 禁止js讀取
                      .path("/")          // path
                      .maxAge(3600 * 24 * 30) // 1個(gè)小時(shí)候過期
                      .build()
                      ;
              // 設(shè)置Cookie Header
              response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
              ThirdLoginCrmEnum source = ThirdLoginCrmEnum.getWithSource(request.getSource());
             //重定向的地址
              response.sendRedirect(source == null ? ThirdLoginCrmEnum.ThirdRedirectCommon.domain: source.getRedirectUrl(request));
          } else {
              response.sendRedirect(ThirdLoginCrmEnum.ThirdRedirectCommon.domain);
          }
      }
    
    

    這里主要是設(shè)置cookie和response.sendRedirect。其他業(yè)務(wù)代碼可以忽略剑肯。
    理論上我在project A的接口里設(shè)置cookie那么同域名下的前端頁面也是適用捧毛。

    事實(shí)如何呢?

    前面我說目前已知Chrome(版本號:90.0.4430.93)無效让网。
    實(shí)際開發(fā)中根據(jù)因?yàn)闉g覽器或版本不同呀忧,可能結(jié)果都不一樣。

    重定向接口返回

    chrome下重定向接口返回.png

從返回的圖片上可以看到溃睹,response header中嘗試去設(shè)置了cookie信息而账。這里說一下圖上 sameSite屬性是我為了測試主動設(shè)置。一般情況下是不會顯示的丸凭,瀏覽器默認(rèn)samesite的屬性為Lax福扬。感興趣的可以自己去了解一下腕铸。
傳送門:cookie的sameSite屬性
細(xì)心的可以看到set-cookie的最后有一個(gè)“警告”標(biāo)識。標(biāo)識的內(nèi)容為:

This Set-Cookie was blocked because it had the "SameSite=Lax" attribute but come from a cross-site response which was not the response to a top-level navigation
此Set-Cookie被阻止铛碑,因?yàn)樗哂小?SameSite = Lax”屬性狠裹,但來自跨站點(diǎn)響應(yīng),而不是對頂級導(dǎo)航的響應(yīng)

簡單的來說就是出現(xiàn)了跨域請求汽烦,但瀏覽器默認(rèn)的SameSite=Lax是不支持跨域下cookie操作的涛菠。因此設(shè)置cookie失敗。具體原因可以參考上面的傳送門撇吞。

同域名下的展示頁請求信息

chrome下重定向的頁面請求.png

重定向到的頁面俗冻,請求頭內(nèi)容的確沒有cookie信息,因此在頁面內(nèi)的請求也是無法正常請求的牍颈。

按這個(gè)思路迄薄,變更一下后端代碼中的cookie設(shè)置。

ResponseCookie cookie = ResponseCookie.from("tk", result.getJSONObject("properties").getString("accessToken")) // key & value
                  .httpOnly(true)     // 禁止js讀取
                  .path("/")          // path
                  .maxAge(3600 * 24 * 30) // 1個(gè)小時(shí)候過期
                  .sameSite("None")
                  .secure(true)
                  .build()
                  ;

設(shè)置sameSite和secure煮岁。

sameSite設(shè)置為None讥蔽,Cookie將在所有上下文中發(fā)送,即允許跨域發(fā)送画机。
且必須要配合secure屬性使用冶伞,需要設(shè)置為true,僅支持https。

處理后再看一下重定向后的展示頁request header:

chrome下重定向的頁面請求(有token).png

已經(jīng)存在了cookie信息步氏。問題解決响禽。

當(dāng)然并非這一種方式。通過設(shè)置瀏覽器也可以達(dá)到相同的效果荚醒。不過這里就不考慮了芋类,畢竟不可能要求用戶設(shè)置一下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腌且,一起剝皮案震驚了整個(gè)濱河市梗肝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铺董,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禀晓,死亡現(xiàn)場離奇詭異精续,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粹懒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門重付,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凫乖,你說我怎么就攤上這事确垫」保” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵删掀,是天一觀的道長翔冀。 經(jīng)常有香客問我,道長披泪,這世上最難降的妖魔是什么纤子? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮款票,結(jié)果婚禮上控硼,老公的妹妹穿的比我還像新娘。我一直安慰自己艾少,他們只是感情好卡乾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缚够,像睡著了一般说订。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潮瓶,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天陶冷,我揣著相機(jī)與錄音,去河邊找鬼毯辅。 笑死埂伦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的思恐。 我是一名探鬼主播沾谜,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胀莹!你這毒婦竟也來了基跑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤描焰,失蹤者是張志新(化名)和其女友劉穎媳否,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆秦,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篱竭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了步绸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺逼。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓤介,靈堂內(nèi)的尸體忽然破棺而出吕喘,到底是詐尸還是另有隱情赘那,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布氯质,位于F島的核電站募舟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏病梢。R本人自食惡果不足惜胃珍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓陌。 院中可真熱鬧觅彰,春花似錦、人聲如沸钮热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隧期。三九已至飒责,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仆潮,已是汗流浹背宏蛉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留性置,地道東北人拾并。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鹏浅,于是被迫代替她去往敵國和親嗅义。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容