1. 概述
2. 谷歌浏览器单点登录失败
问题描述:
谷歌浏览器 80 版本及以上单点登录失败,跳转到登录页,其他浏览器正常。
原因分析:
Chrome80.0及以上版本浏览器修改了安全策略,默认 SameSite 策略不允许 cookie 跨站发送,因此单点登录会失败。
2.1 https解决方案
2.1.1 非运维平台部署的帆软应用
对于非运维平台部署的帆软应用,且工程版本为11.0.4及之后,
若已升级工程为 https,可直接使用产品内置的HTTPS_SameSite_跨域策略,无需任何操作。
https 设置跨域单点登录后,可直接实现跨站单点登录。
2.1.2 运维平台部署的帆软应用
1)下载并解压,获取配置文件CORS.conf:CORS.zip
2)将CORS.conf上传到帆软应用的/nginx外挂目录/conf/custom目录中。
如不存在该目录,请手动创建,并赋予足够的读写权限
如不清楚外挂目录位置,可通过导出部署信息找回,详情请参见:导出项目部署信息
3)登录运维平台,选择指定项目,点击「维护>组件管理」,重启nginx组件。
4)重启解析配置时,会自动加载配置文件CORS.conf,将内容合并到nginx.conf文件的location / ${APP_PATH}块内,即可实现跨站单点登录。
2.2 http解决方案
注:本节方案配置比较复杂,推荐将工程升级为 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.3 临时解决方案
该临时方案是通过修改谷歌的设置解决的,每台访问工程的电脑都需要修改谷歌的设置,使用体验差,不太推荐;推荐使用2.1节方案。
该临时方案适用于所有谷歌内核浏览器,如新 edge(访问edge://flags/)、360 安全浏览器(访问se://flags/)等,但不适用于 91 及以上版本的谷歌内核浏览器。
在谷歌浏览器地址栏中输入:chrome://flags/,然后在搜索框输入「SameSite」搜索并找到「SameSite by default cookies」选项,右侧按钮选择「Disabled」。
设置完成后,需要重启谷歌浏览器,方可生效。如下图所示:
3. IE浏览器单点登录失败
问题描述:
用户在 IE 浏览器上单点登录失败,但开启 IE 浏览器的调试模式又可以正常单点登录。
原因分析:
单点登录代码中使用console.log()打印 debug 信息,在 IE 浏览器中该代码是默认不执行的,需要在 F12 打开调试工具才有效。
解决方案:
把打印日志的代码屏蔽掉即可正常登录。如下图所示:
4. IE11浏览器单点登录失败
问题描述:
iframe 跨域单点登录在 IE11 浏览器上失败。
解决方案:
1)由于 IE11 没有 attachEvent 这个属性,需要添加一个 meta 标签来设置浏览器的默认兼容模式,通过在 html 的 head 标签中加入下面代码:
meta 标签用来设置浏览器的默认兼容模式为 IE10,这样就可以依旧使用 attachEvent 属性。
2)另外 IE11 浏览器需要将报表服务器的地址加入到受信任的站点中,如下图所示:
比如工程地址为http://172.17.0.20:37799/webroot/decision,配置如下图所示:
5. Safari浏览器跨域单点登录失败
问题描述:
跨域情况下,使用 Safari 浏览器或其他 H5 方式在移动端预览报表时,iOS 设备单点登录失败,Android 设备正常。
注:请确认移动端登录页面是原生页面还是 H5 页面,如果是原生页面,可直接使用原生的单点登录方式,这个不涉及跨域 。
如果登录页面也是 H5 的,只能用常规的 JavaScript 单点登录。
由于 cookie 问题导致单点失败。
Safari 浏览器安全级别比较高,跨域情况下,默认不允许第三方 Cookie 写入,或者只允许访问过的网站写入。
解决方案:
1)针对客户端浏览器,设置允许 Cookie 写入即可。如下图所示:
2)针对移动端 App 里的容器(比如 WebView),用户有自己的 App 框架前提下,需要用户自己的研发人员加两行代码,设置成接受 Cookie 即可。如下图所示:
代码如下所示:
5. 内网环境下单点登录失效
问题描述:
内网环境下,单点登录失败。
原因分析:
单点登录代码中,若引用了 JS 文件,内网环境下是无法生效的。如下图所示:
解决方案:
下载 JS 文件到本地并修改对应的路径即可。以 Ajax 跨域异步单点登录 为例:
1)访问右侧链接: 各版本 jquery下载 ,下载代码中对应的 jquery 文件。
2)将所下载文件中的jquery.min.js文件放到%BI_HOME%\webapps\webroot下,如下图所示:
3)修改 HTML 文件中jquery.min.js文件的路径,如下图所示:
6. 保持登录状态
问题描述:
单点登录不能勾选保持登录状态,有时会在登录一段时间后自动退出。
原因分析:
单点登录接口:http://localhost:8080/webroot/decision/login/cross/domain?fine_username=XX&fine_password=XX&validity=-2&callback=
validity 值:
-2:表示保持登录,保持登录就是 14 天的时间。
非-2:非保持登录,时长跟随:「管理系统>系统管理>登录>登录超时时间」
解决方案:
如果希望单点登录时保持登录,将参数 validity 的值改为 -2 即可
如果希望不保持长期登录,可进入数据决策系统,在平台「系统管理>登录」处统一设置「登录超时时间」,如下图所示:
7. 控制台显示登录成功但平台仍需登录
问题描述:
在 IE 浏览器下打开控制台显示单点登录成功,但是访问决策系统时依旧会提示需要登录,如下图所示:
原因分析:
IE 隐私等级过高,这样会导致它发送单点登录请求后,平台返回的 cookie 写不进去,而其他浏览器是默许的。
解决方案:
将 IE 隐私等级调整到低或以下。
8. 特殊密码单点登录失败
问题描述:
用户密码包含特殊字符,例如hgyusdre+CVsdej+HU09Y6y==,单点登录失效。但如果在登录页输入账号密码,登录成功。
原因分析:
当密码存在特殊字符,通过单点登录接口直接访问会失败,需要对密码进行转码。
解决方案:
1)打开浏览器控制台,以谷歌浏览器为例,在控制台中输入encodeURIComponent("密码"),可将密码进行转码。如下图所示:
2)单点登录接口使用转码的密码进行访问。