当前位置: 首页 > >

多系统单点登录(sso)设计

发布时间:



文章目录
问题提出登录信息共享机制设计简单实现淘宝天猫登录信息共享(简化版)
登录流程


问题提出
多个系统中,如何做到其中一个系统登录了,在浏览器中打开其他系统也会成登录状态?比如在淘宝登陆了,打开天猫网页,也会显示已登录网上有一种设计方案是通过二级域名来共享登录状态,本设计是针对不同域名下登录状态的信息共享。
登录信息共享机制设计
简单实现

实现原理:



通过在sso系统域名下存储信息,其他系统通过获取sso域下的cookie信息来获取登录信息
不过有个问题:出于安全的原因,当前域不能获取其他域的cookie信息,所以只能通过跨域访问sso系统,然后返回登录信息



在开始前我们设定两个变量:


t_token 这个浏览器的一个标志,在同一个浏览器中,所有相关系统内的网站共享同一个t_tokenaccess_token 用户真正的token

要实现上述功能,我们可以使用跨域机制来实现共享token。这里我们设置三个系统,两个客户端系统,一个sso系统。如图:


流程如下:

以上就是通过跨域来同步token的流程。


在上面的流程中,会存在一个跨域访问的问题,一般来说有两种解决方法:


使用jsonp来获取使用CORS机制跨域获取数据

具体的可以看这两篇文章:


CORS详解
跨域访问数据


淘宝天猫登录信息共享(简化版)

淘宝天猫token的获取原理是一样的,但是流程要稍复杂一些。主要是多了几个重定向的步骤。废话不多说,直接看时序图,咱们看图说话:
注:图中设计的网址并非是实际的,我只是写来做例子


可以看到,流程中经过多次的重定向最终使天猫中的cookie中有了t_tokenaccess_token的值



重定向的意义:
实际上我们完全可以通过跨域一次请求就可以把token拿到,就像我们的第一个例子一样,为什么要经过这么多次重定向呢。个人认为有以下几点:


    获取token的值完全由服务器设置到对应域名的cookie中,在安全方面更有保障在请求过程中,服务器可以检测该域名下的请求是否允许重定向,可以进一步保*踩


登录流程

登录流程相对来说大家比较熟悉,在此就简单的写下流程就行了。在登录之后可以通过上面的设计共享token
流程如下:


登录完成后再sso.com和a.com都有t_token,access_token。如果此时打开网页b.com,跨域获取访问sso系统,然后获得登录信息


以上讲了多系统单点登录的原理和流程图,其中需要注意的点是跨域访问,如果不懂前端的,比如我一开始看到请求被拒绝访问,也是一脸懵逼。我在文中也放了两篇优秀的文章,不懂的可以看看。



友情链接: