单点登录认证原理及跨域cookie共享
一、单点登录
单点登录认证,在系统配置单点登录拦截器,拦截所有请求。在浏览器中输入系统url,因为设置了所有请求拦截,所有请求都进入这个拦截器中。自定义一个cookie名称,比如为sso.xb.com, 第一次访问时servletRequest里无cookies,这时会网址重定向到设置的单点登录页面,进行单点认证登录。登录完成后跳转至当前系统,这时浏览器含有一个sso.xb.com的cookie。如果是前后端一体的项目,满足http的同源策略,则该cookie是共享的。跳转至当前系统时拦截器再次拦截到到请求,将该cookie的value作为key,用户信息作为value,存放在Map中,注意:这里Map是非线性安全的,保证每个线程获取的用户信息一致。这个过程就是单点登录的基本原理了。
二、跨域cookies共享
手头负责的一个项目有幸成为公司零售平台的一环。使用单点登录作为统一认证。今天遇到了一个问题。我在本地开发时,单点登录认证成功后,后面再进行restful请求时后端能捕捉到sso.xb.com这个cookie,但嵌套了零智平台的script后发现单点登录成功后刷新页面又跳到单点登录页面,很好奇是什么原因造成的。仔细追踪发现,不嵌套零智平台的script脚本单点登录是正常的。加了后就出现这个问题。
这是什么原因造成的呢?
后面发现http遵守同源策略,同源策略可参考阮老师这篇文章,同源策略告诉我们,ajax或Promise请求时会携带同源cookie,非同源项目,则存在跨域问题,需要设置在ajax或XMLHttpRequest里设置withCredentials为true,后端设置header的方式来让请求携带不同源cookie,当然这个属性对同源请求没有任何影响, 会被自动忽略,因为我的系统嵌套在零智系统里,所以按常规处理是共享cookie的,这就是为何添加了零智平台的script后单点登录认证失败的原因。解决的办法很简单,采用CORS标准,即可解决我的问题,CORS详解参考阮老师这篇文章。
综上所述:解决跨域问题 必须给跨域url加个头信息Origin和Access-Control配置 这样表示即表示服务器(零智平台后台)明确许可,零智平台的Cookie可以包含在请求中,一起发给服务器 (本系统)。