单点登录SSO

发布时间 2023-09-28 17:15:50作者: wanglei1900

单点登录SSO

单点登录实现方式主要使用CAS和OAuth

知识点梳理

  • SSO-Single Sign On,单点登录

  • CAS-Central Authentication Service,中央认证服务

  • OAuth-Open Authorization,它是一种开放授权协议,开放第三方登录方式

SSO前的痛点

一个系统多个模块,用户频繁登录,用户体验极差。一次登录后,全局下多个系统免登录。

CAS 流程

知识点梳理

  • tmpTicket- 一次性临时门票,连接CAS和站点的桥梁
  • ST-Service Ticket,站点门票
  • TGT-Ticket granting ticket 全局门票
  • TGC-Ticket Granting Cookie,存放全局门票的cookie

CAS是一种实现SSO的方式,主要用于解决企业内部多个系统之间的单点登录问题。
场景:一个系统下有直播模块A(url www.a.com),购物模块B (url www.b.com),CAS认证服务(url http://www.cas.com/login) 。

  1. 客户端访问直播模块A:用户初次访问www.a.com进入直播模块A,由于初次访问没有登录,跳转到CAS登录界面。
  2. CAS定向认证:CAS服务器验证全局门票TGT,TGT不通过,则将直播模块A的地址包装为参数并转向CAS服务器定向认证,重定向到CAS登录界面下http://www.cas.com/login?redirect_uri=www.a.com(nginx重定向登录页)。
  3. 客户端在CAS登录:登录通过后,服务端创建全局门票TGT,服务端在客户端CAS的cookie设置TGC,服务端同时会使用哈希Map关联用户id和TGC并存储在Redis中,并生成一个临时门票tmpTicket,并将uri返回给前端www.a.com?tmpTicket=${tmpTicket}
  4. 返回直播模块A并登录:客户端接收到成功的返回后反问之前的地址,由客户端定向到window.location.href = www.a.com?tmpTicket=${tmpTicket}
  5. 直播模块A校验登录:www.a.com?tmpTicket=${tmpTicket}校验临时门票tmpTicket,axios.post('http://www.cas.com/verifyTmpTicket?tmpTicket=${tmpTicket}'),校验通过则Redis销毁tmpTicket,拿到CAS端cookie中的全局门票TGT(CAS站点的Cookie为可跨域访问,SameSite:none,Secure:true,也就是CAS单点登录为什么需要https),根据TGT发放ST,客户端带ST访问成功登录。
  6. 客户端访问购物模块B(重复步骤2):用户初次访问www.b.com进入购物模块B,由于初次访问没有登录,跳转到CAS登录界面。
  7. CAS定向认证:由于直播模块A已经登录过,因此可以从CAS中取到全局门票,直接生成临时门票。
  8. 购物模块B校验登录:重复步骤5。至此,客户端成功登录购物模块B,但是没有输入账号密码。注销同理。

OAuth2 流程

OAuth2则是一种开放授权机制,主要用于解决不同企业之间的单点登录问题,它允许用户通过第三方应用程序(如Google、Facebook等)进行身份验证和授权。