keycloak~對接企業微信時的referer問題

referer,正確寫法referrer,指的是網站的一種安全策略,在請求頭CSP(Content-Security-Policy),標籤或者是指定的html標籤裏都可以設置它,它指的是上一個請求的來源記錄,比如你從a1通過鏈連,跳到a2,那在a2的請求頭裏,就會有a1的網址或者域名,這個和referrer策略有關。

Referrer-Policy策略介紹(注意這裏是Referrer)

1 no-referrer
整個 Referer 首部會被移除。訪問來源信息不隨着請求一起發送

2 no-referrer-when-downgrade (默認值)
在沒有指定任何策略的情況下用戶代理的默認行爲。在同等安全級別的情況下,引用頁面的地址會被髮送(HTTPS->HTTPS),但是在降級的情況下不會被髮送 (HTTPS->HTTP)。

3 origin
在任何情況下,僅發送文件的源作爲引用地址。例如 https://example.com/page.html 會將 https://example.com/ 作爲引用地址。

4 origin-when-cross-origin
對於同源的請求,會發送完整的URL作爲引用地址,但是對於非同源請求僅發送文件的源。

5 same-origin
對於同源的請求會發送引用地址,但是對於非同源請求則不發送引用地址信息

6 strict-origin
在同等安全級別的情況下,發送文件的源作爲引用地址(HTTPS->HTTPS),但是在降級的情況下不會發送 (HTTPS->HTTP)。

7 strict-origin-when-cross-origin
對於同源的請求,會發送完整的URL作爲引用地址;在同等安全級別的情況下,發送文件的源作爲引用地址(HTTPS->HTTPS);在降級的情況下不發送此首部 (HTTPS->HTTP)。

8 unsafe-url
無論是同源請求還是非同源請求,都發送完整的 URL(移除參數信息之後)作爲引用地址。(最不安全的策略了)

kc集成了企業微信後的問題

  • 由於企業微信的二維碼是在它們自己的網站上生成的,而它們企業微信爲了安全,會判斷請求頭的referer,這個referer是在“企業微信後臺-登錄授權-登錄授權發起域名”進行配置的,也就是說,你跨轉到二維碼頁面之前,你的域名需要是合法的。
  • 在KC集成的社區登錄中,登錄按鈕會先到KC自己的頁面進行參數組裝,然後307方式的重定向到社區登錄頁,而在referer中,信息傳遞不支持redirect這種,所以,我們需要進行從新設計。

通過頁面輸出TEXT_HTML來解決這個問題

public Response performLogin(AuthenticationRequest request) {
    try {
      URI authorizationUrl = createAuthorizationUrl(request).build();
      return Response.ok("<html><head>" +
          "<script type=\"text/javascript\">function a1(){" +
          "document.getElementById('jump').click();"+
          "}</script>" +
          "</head>" +
          "<body onload='a1()'>" +
          "<a href='"+authorizationUrl+"' id='jump' referrerpolicy=\"strict-origin-when-cross-origin\">頁面跳轉中...</a>"+
          "</body></html>", MediaType.TEXT_HTML).build();
    } catch (Exception e) {
      e.printStackTrace(System.out);
      throw new IdentityBrokerException("Could not create authentication request.", e);
    }
  }

微信端網址的請求頭的referrer策略

其中strict-origin-when-cross-origin表示在跨域時,記錄前一天網站的域名,請求頭信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章