本文介紹單點登入中,常見的問題及排查步驟。
問題描述:
谷歌瀏覽器 80 版本及以上單點登入失敗,跳轉到登入頁,其他瀏覽器正常。
原因分析:
Chrome80.0及以上版本瀏覽器修改了安全策略,預設 SameSite 策略不允許 cookie 跨站傳送,因此單點登入會失敗。
對於非維運平台部署的帆軟應用,且工程版本為11.0.4及之後,
若已升級工程為 https,可直接使用產品內建HTTPS_SameSite_跨域策略,無需任何操作。
https 設定跨域單點登入後,可直接實現跨站單點登入。
1)下載並解壓,獲取配置檔案CORS.conf:CORS.zip
2)將CORS.conf上傳到帆軟應用的/nginx外掛目錄/conf/custom目錄中。
如不存在該目錄,請手動建立,並賦予足夠的讀寫權限
如不清楚外掛目錄位置,可透過匯出部署資訊找回,詳情請參見:匯出專案部署資訊
3)登入維運平台,選擇指定專案,點選「維護>組件管理」,重啟nginx組件。
4)重啟解析配置時,會自動載入配置檔案CORS.conf,將內容合併到nginx.conf檔案的location / ${APP_PATH}塊內,即可實現跨站單點登入。
注:本節方案配置比較複雜,推薦將工程升級為 https 後,再參考本文2.1節優化。
參考下方跨站說明,保證兩個工程的頂層領域名稱、次頂層領域名稱相同,比如 a.b.com 和 c.b.com,「.com」頂級,「b」是次頂級。舉例:bbs.fanruan.com、help.fanruan.com,頂層領域名稱均為 .com,次級域名均為 fanruan,這樣的兩個工程則不會出現此問題。
跨站說明:
跨站是用 Public Suffix List 域名後綴列表 來判斷的。
兩個 URL ,頂層領域名稱和次頂層領域名稱內容(後面用 public suffix+1 指代)相同,為同站:
頂層領域名稱:從 Public Suffix List 域名後綴列表中匹配的最長後綴長度。
次頂層領域名稱:頂層領域名稱前面的欄位。
注:頂層領域名稱列表可參見:頂層領域名稱列表
比如 www.sina.com.cn 的 public suffix+1 是 sina.com.cn,www.sohu.com.cn 的 public suffix+1 是 sohu.com.cn, 兩者不一樣,所以不屬於同一個地點。
再比如 nanzhuang.taobao.com 的 public suffix+1 是 taobao.com,nvzhuang.taobao.com 的 public suffix+1 也是 taobao.com,那麼它倆就是同一個地點的。
可透過代理,將帆軟和第三方系統配置到同一域名下,第三方系統裏面配置的報表連結需要改成走代理的連結。即可繞過samesite。
該臨時方案是透過修改谷歌的設定解決的,每台存取工程的電腦都需要修改谷歌的設定,使用體驗差,不太推薦;推薦使用2.1節方案。
該臨時方案適用於所有谷歌核心瀏覽器,如新 edge(存取edge://flags/)、360 安全瀏覽器(存取se://flags/)等,但不適用於 91 及以上版本的谷歌核心瀏覽器。
在谷歌瀏覽器地址欄中輸入:chrome://flags/,然後在搜尋框輸入「SameSite」搜尋並找到「SameSite by default cookies」選項,右側按鈕選擇「Disabled」。
設定完成後,需要重啟谷歌瀏覽器,方可生效。如下圖所示:
使用者在 IE 瀏覽器上單點登入失敗,但開啟 IE 瀏覽器的除錯模式又可以正常單點登入。
單點登入程式碼中使用console.log()列印 debug 資訊,在 IE 瀏覽器中該程式碼是預設不執行的,需要在 F12 開啟除錯工具才有效。
解決方案:
把列印日誌的程式碼遮蔽掉即可正常登入。如下圖所示:
问题描述:
iframe 跨域单点登录在 IE11 浏览器上失败。
解决方案:
1)由于 IE11 没有 attachEvent 这个属性,需要添加一个 meta 标签来设置浏览器的默认兼容模式,通过在 html 的 head 标签中加入下面代码:
<meta http-equiv="X-UA-Compatible" content="IE=10" />
meta 标签用来设置浏览器的默认兼容模式为 IE10,这样就可以依旧使用 attachEvent 属性。
2)另外 IE11 浏览器需要将报表服务器的地址加入到受信任的站点中,如下图所示:
比如工程地址为http://172.17.0.20:37799/webroot/decision,配置如下图所示:
跨域情況下,使用 Safari 瀏覽器或其他 H5 方式在行動端預覽報表時,iOS 裝置單點登入失敗,Android 裝置正常。
注:請確認行動端登入頁面是原生頁面還是 H5 頁面,如果是原生頁面,可直接使用原生的單點登入方式,這個不涉及跨域 。
如果登入頁面也是 H5 的,只能用標準的 JavaScript 單點登入。
由於 cookie 問題導致單點失敗。
Safari 瀏覽器保全等級比較高,跨域情況下,預設不允許第三方 Cookie 寫入,或者只允許存取過的網站寫入。
1)針對使用者端瀏覽器,設定允許 Cookie 寫入即可。如下圖所示:
2)針對行動端 App 裏的容器(比如 WebView),使用者有自己的 App 框架前提下,需要使用者自己的研發人員加兩行程式碼,設定成接受 Cookie 即可。如下圖所示:
程式碼如下所示:
NSHTTPCookieStorage *cook = [NSHTTPCookieStorage sharedHTTPCookieStorage];[cook setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
內網環境下,單點登入失敗。
單點登入程式碼中,若引用了 JS 檔案,內網環境下是無法生效的。如下圖所示:
下載 JS 檔案到本地並修改對應的路徑即可。以 Ajax 跨域非同步單點登入 為例:
1)存取右側連結: 各版本 jquery下載 ,下載程式碼中對應的 jquery 檔案。
2)將所下載檔案中的jquery.min.js檔案放到%BI_HOME%\webapps\webroot下,如下圖所示:
3)修改 HTML 檔案中jquery.min.js檔案的路徑,如下圖所示:
單點登入不能勾選保持登入狀態,有時會在登入一段時間後自動跳出。
單點登入API:http://localhost:8080/webroot/decision/login/cross/domain?fine_username=XX&fine_password=XX&validity=-2&callback=
validity 值:
-2:表示保持登入,保持登入就是 14 天的時間。
非-2:非保持登入,時長跟隨:「管理系統>系統管理>登入>登入逾時時間」
如果希望單點登入時保持登入,將參數 validity 的值改為 -2 即可
如果希望不保持長期登入,可進入數據決策系統,在平台「系統管理>登入」處統一設定「登入逾時時間」,如下圖所示:
在 IE 瀏覽器下開啟控制台顯示單點登入成功,但是存取決策系統時依舊會提示需要登入,如下圖所示:
IE 隱私等級過高,這樣會導致它傳送單點登入請求後,平台傳回的 cookie 寫不進去,而其他瀏覽器是默許的。
將 IE 隱私等級調整到低或以下。
使用者密碼包含特殊字元,例如hgyusdre+CVsdej+HU09Y6y==,單點登入失效。但如果在登入頁輸入帳號密碼,登入成功。
當密碼存在特殊字元,透過單點登入API直接存取會失敗,需要對密碼進行轉碼。
1)開啟瀏覽器控制台,以谷歌瀏覽器為例,在控制台中輸入encodeURIComponent("密碼"),可將密碼進行轉碼。如下圖所示:
2)單點登入API使用轉碼的密碼進行存取。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙