单点登录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(urlwww.a.com
),购物模块B (urlwww.b.com
),CAS认证服务(urlhttp://www.cas.com/login
) 。
- 客户端访问直播模块A:用户初次访问
www.a.com
进入直播模块A,由于初次访问没有登录,跳转到CAS登录界面。 - CAS定向认证:CAS服务器验证全局门票TGT,TGT不通过,则将直播模块A的地址包装为参数并转向CAS服务器定向认证,重定向到CAS登录界面下
http://www.cas.com/login?redirect_uri=www.a.com
(nginx重定向登录页)。 - 客户端在CAS登录:登录通过后,服务端创建全局门票TGT,服务端在客户端CAS的cookie设置TGC,服务端同时会使用哈希Map关联用户id和TGC并存储在Redis中,并生成一个临时门票tmpTicket,并将uri返回给前端
www.a.com?tmpTicket=${tmpTicket}
。 - 返回直播模块A并登录:客户端接收到成功的返回后反问之前的地址,由客户端定向到
window.location.href = www.a.com?tmpTicket=${tmpTicket}
。 - 直播模块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访问成功登录。 - 客户端访问购物模块B(重复步骤2):用户初次访问
www.b.com
进入购物模块B,由于初次访问没有登录,跳转到CAS登录界面。 - CAS定向认证:由于直播模块A已经登录过,因此可以从CAS中取到全局门票,直接生成临时门票。
- 购物模块B校验登录:重复步骤5。至此,客户端成功登录购物模块B,但是没有输入账号密码。注销同理。
OAuth2 流程
OAuth2则是一种开放授权机制,主要用于解决不同企业之间的单点登录问题,它允许用户通过第三方应用程序(如Google、Facebook等)进行身份验证和授权。