项目经验

单点登录的几种实现方案

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传输,不存在跨域问题

技术方案二

  1. 每个应用提供一个ssoLogin接口,用于接收ticket参数;
  2. 登录门户后,点击应用图标时,门户后端调用用户中心的接口获取用户对应的ticket,携带该ticket参数回调应用的ssoLogin接口;
  3. ssoLogin接口中,根据ticket调用用户中心的接口,获取token,并把token写到cookie,然后重定向到应用首页;
  4. 应用首页判断cookie中存在token,调用应用后端接口,获取用户信息等资源,实现单点登录。

以上方案二,有一些细节需要注意

  1. 如果门户没有提供内置浏览器,用户点击应用后是用默认浏览器打开,即使是同一个用户,也需要为门户和应用提供不同token,否则门户和应用之间会互相影响。假设门户和应用A使用同一个token,用户登录了门户,然后单点到应用A,然后在应用A上操作,如果退出门户后,token失效,导致应用A也登录失效,用户体验比较差。同理,不同应用之间,也需要不同token,否则也会互相影响;
  2. 如果门户提供了内置浏览器,门户和应用可以使用同一个token,只有退出门户,token才失效;
    (内置浏览器可以禁用控制台,相比直接用默认浏览器打开更安全)
  3. 方案的步骤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)。

上一篇 下一篇

猜你喜欢

热点阅读