跨域实现统一登录

很多时候,如果没有理解原理,做起事来会感觉无从下手、困难重重,一旦把原理想清楚了,做起来就会从容不迫。

 

切入正题:在相同域名下实现统一认证单点登录比较简单,基于Cookie结合共享Redis就可以轻松实现。在同一个域名下,不同的系统共享相同的cookie,认证中心可以将会话ID(服务器的sessionId或者自己颁发的token)存入Cookie中,应用系统获取到会话ID后请求Redis校验登陆态即可。当然为了安全起见,一般应用系统不能直接访问Redis,由认证中心提供代理接口供应用系统调用获取登录信息,代理接口可以完成安全检查和白名单准入。

 

在跨域时,不同域名之间不能共享Cookie,造成了登陆态无法共享。为了解决Cookie不能共享的问题,必须要想办法将认证中心的会话ID传给跨域的第三方应用系统。假设认证中心所在域名为A域,第三方应用系统所在域名为B域,最好能直接把认证中心完成登陆认证的会话ID写在B域名下的Cookie中,这样B域名下的所有应用系统都可以共享登陆态。为了实现此目标,我们在A域名的认证中心系统(或者另外提供一个代理系统)中提供一个可以跨域访问的URL地址,B域下的系统使用AJAX通过JSONP访问此URL地址,在访问请求头中Refer会记录B域信息,URL接口首先校验访问来源是否合法,然后判断A域下是否存在已登录的认证中心的服务器会话ID,如果用户在认证中心完成登录认证,此URL在返回信息中提供认证中心的会话ID,否则返回空值。AJAX拿到会话ID不为空时(为空就跳去认证中心做登录认证),传递给B域下的应用系统,系统后台通过认证中心提供的代理接口获取与会话ID相关的登录信息,如果拿到则认为用户已登录,将用户信息返回给前端页面并在B域下的Cookie中写入认证中心的会话ID,如果拿不到则页面跳转至认证中心登录。此时B域名下的Cookie中已写入认证中心的会话ID,B域下的所有应用系统都可以实现单点登录会话共享了。以此类推,如果有C域、D域,都可以按此方式接入统一认证中心。

 

所以跨域实现统一登录态的核心在于:1、认证中心要提供一个可跨域访问的URL接口;2、B域要能在自己的Cookie中写入已登录用户的会话ID;3、B域下的系统能通过后台访问到A域名下Redis的代理接口,即网络策略要通,否则无法校验用户是否真的登录了。

 

附图如下:


跨域实现统一登录_第1张图片
 

你可能感兴趣的:(跨域实现统一登录)