目录:
1. 概述编辑
2. 谷歌浏览器单点登录失败编辑
问题描述:
谷歌浏览器 80 版本及以上单点登录失败,跳转到登录页,其他浏览器正常。
原因分析:
Chrome80.0及以上版本浏览器修改了安全策略,默认 SameSite 策略不允许 cookie 跨站发送,因此单点登录会失败。
2.1 https解决方案
产品内置了HTTPS_SameSite_跨域策略,https设置跨域单点登录后,可直接实现跨站单点登录。
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,那么它俩就是同一个站点的。
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)单点登录接口使用转码的密码进行访问。
9. token读取失败导致登录异常编辑
登录时提示:登录信息已失效,错误代码:21300019,如下图所示:
原因分析:工程环境设置 HttpOnly 、域名等情况后,阻止了前台从 cookie 里读取 token,从而无法写入到 header 里。
进行如跨域登录、后台单点等登录操作,导致后台读取 token进行身份验证失败。
解决方案:超级管理员可将 FineDB 的 fine_conf_entity 表中 ServerConfig.tokenFromCookie 参数值修改为 true,并重启服务器。
注:修改 FineDB 数据库表字段值的方法请参考 FineDB 常用表字段修改
参数及对应的值说明如下表所示:
参数名 | 参数值 |
---|---|
ServerConfig.tokenFromCookie | 参数值需为布尔型,默认为 false
|