单点登录的几种实现方案
2021-01-19 本文已影响0人
修行者12138
方案一
适用场景
用户已经登录企业门户的前提下,单点登录到门户中的应用。门户与应用的域名有一定关系,门户的域名是父级域,比如xxx.com,应用的域名为二级域,比如a.xxx.com、b.xxx.com、c.xxx.com
image.png
技术方案
登录门户后,颁发一个token用于接口认证,创建一个key为_a,domain为.xxx.com,path为/,value为token的cookie并set-cookie到前端,访问其他应用时,由于_a的domain为其他应用域名的父级域,会自动带上_a到后端,后端根据_a做接口校验,获取用户信息等资源,实现单点登录。
image.png
方案二
适用场景
用户已经登录企业门户的前提下,单点登录到门户中的应用。门户与应用的域名没有关系。
技术方案一
依旧使用上面的方案一,但是token使用header传输,不存在跨域问题
技术方案二
- 每个应用提供一个ssoLogin接口,用于接收ticket参数;
- 登录门户后,点击应用图标时,门户后端调用用户中心的接口获取用户对应的ticket,携带该ticket参数回调应用的ssoLogin接口;
- ssoLogin接口中,根据ticket调用用户中心的接口,获取token,并把token写到cookie,然后重定向到应用首页;
- 应用首页判断cookie中存在token,调用应用后端接口,获取用户信息等资源,实现单点登录。
以上方案二,有一些细节需要注意
- 如果门户没有提供内置浏览器,用户点击应用后是用默认浏览器打开,即使是同一个用户,也需要为门户和应用提供不同token,否则门户和应用之间会互相影响。假设门户和应用A使用同一个token,用户登录了门户,然后单点到应用A,然后在应用A上操作,如果退出门户后,token失效,导致应用A也登录失效,用户体验比较差。同理,不同应用之间,也需要不同token,否则也会互相影响;
- 如果门户提供了内置浏览器,门户和应用可以使用同一个token,只有退出门户,token才失效;
(内置浏览器可以禁用控制台,相比直接用默认浏览器打开更安全) - 方案的步骤2中,为什么要用ticket回调应用接口,不直接用token回调应用接口?
假如用token回调,token在一定有效期内可以重复使用,也就是说,a.xxx.com?token=3cm24j123o这一个url,可以多次使用,只要拿到这个url且token未失效,就可以直接免密登录应用,显然是不安全的。
假如用ticket回调,可以控制一个ticket只有一次使用机会,即a.xxx.com?ticket=mcam32312i3只能使用一次。
方案三
适用场景
没有门户,或者用户不提前登录门户的前提下,不同应用实现单点登录。
技术方案
CAS,网上教程众多,比如CAS简介和整体流程。
方案二实际上也是利用了CAS思想实现的,ticket和token,可以类比CAS的ST(Service Ticket)和TGC(Ticket Granted Cookie)。