SSO单点登录(仿天猫淘宝)
需求提出·
随着公司业务发展,各种业务系统也在不断上线(OA系统、运营后台管理系统、各种数据后台系统,游戏赛事后台系统等),运营人员需要去维护多套系统,每个系统都有各自的用户模块,导致后台维护这块变得复杂,此时统一的用户管理模块显得极其重要,可以极大提升运营效率。刚好公司把这个任务交给我,所以我也了解了几种单点登录实现原理,最后以阿里系(天猫、淘宝)的SSO为原型,仿照其实现自己公司的SSO。
需求分析·
1、什么是SSO?SSO特点?
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一
2、SSO最大难点是什么?
个人觉得SSO最大的难点是在各系统如何识别用户是同一个用户,即各系统如何识别访问系统群的是同一个用户;所以此时就需要一个公共的key,当用户访问系统群中的某个子系统时,都会获得这个key,用于标记访问系统的是同一个用户。
此处采用的方法为:用户刚访问任一系统页面时都会SSO生成mini_token,并保存在SSO中,以后访问任一系统时候,用户都会去SSO中获取mini_token。具体方法如下:
1、当用户访问客户端1(任一子系统)时,用户会先从客户端1去请求SSO系统从SSO域的cookie中拉取mini_token,SSO接受到请求后返回mini_token重定向到客户端1的域(PS:此处中若SSO域cookie中也不存在mini_token,则SSO生成一个mini_token塞进自己cookie中,然后重定向回客户端1),然后客户端1设置自己的mini_token cookie,这样就保持了客户端跟SSO具有同一的一个key。
2、当用户打开客户端2首页时,客户端2也会去请求SSO域cookie中拉取mini_token,此时因为用户之前访问过SSO,所以此时SSO域是存在mini_token的cookie的,直接从cookie中获取mini_token后重定向回客户端2,客户端2接收到mini_token后设置自己的mini_token cookie,至此,你可以看到,客户端1、客户端2、SSO都持有相同mini_token cookie,无论后面还有多少个系统,打开后都会去获取SSO的mini_token cookie,以此保持用户身份一致标记
3、为什么说mini_token是用户身份标记呢?用户登录SSO时会携带mini_token,登录成功后,生成访问令牌access_token,并且会以mini_token,access_token为键值对保存在redis中,当用户再打开一个新的系统的时候,都会去拉取mini_token,用户就能根据自己当前的mini_token去获得access_token,获得自己的access_token后就可以去访问系统了。我们可以看到,此时的mini_token其实就是代表用户本身。
方法流程·
1、登录流程:
2、登出流程
实现部分代码展示·
1、跨域代码:跨域需要前后端配合完成
总结·
第一次写简书,第一次画拓扑图,不好还请见谅。。。