[陈同学i前端] 用户认证 | 抽象的SSO具象的CAS

200 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

大家好,我是陈同学,一枚野生前端开发者,感谢各位的点赞、收藏、评论

CAS(Central Authentication Service):中央认证服务,一种独立开放指令协议,目标是为Web应用系统提供一种可靠的单点登录方法

本节文章我们就来聊聊CAS的结构设计与用户认证流程

本文阅读成本与收益如下:

阅读耗时:3mins

全文字数:2k

预期效益

  • 了解SSO
  • 学习CAS用户认证流程

什么是SSO

SSO(Single Sign-On):单点登录

用户在身份认证服务器上登录一次,即可获得访问单点登录系统中其他关联系统和应用的权限

对于技术来说,这种方式将用户认证逻辑抽离成一个单独的服务模块,无需让每一个应用都开发完整的用户登录校验功能模块,降低开发成本

对于用户来说,只需要登录一次就可以同时访问多个关联应用,无需重复登录

举个例子:

我们去水上游乐园玩的时候,进门需要买票(登录),验票成功后便可以入园玩耍

一般园内每一种游乐设施均直接向我们开放使用,无需重复进行购票(登录),只需要佩戴专属的手环(通票)即可

CAS组成

CAS的两部分:

  • CAS-Server:用户的认证工作,就像是把第一次登录用户的一个标识存在这里
  • CAS-Client:业务web应用服务,登录逻辑接入CAS Server端

相关概念:

TGT(Ticket-Granting ticket):CAS-Server根据用户名登录提供的凭证(密码)生成的一张票(本质上理解成一段字符串),缓存在Server端,应用过程中配合TGC生成ST

TGC(Ticket-Granting cookie):一个Cookie字符串,存放用户身份信息,由Server通过Response Header发给Client端

ST(Service ticket):由TGT生成的一次性票据(一般有效期设置为5mins,并且只能用一次),用于给CAS-Client到CAS-Server中验证用户身份

CAS登录流程

第一次访问应用A

用户第一次访问应用网站A,网站A的服务中发现没有Cookie的登录态,则将请求转发到CAS-Client,检测发现query当中也没有没有ST字符串,故将用户重定向到CAS-Server的登录页面

用户于登陆页面输入用户名登录认证,认证成功后CAS-Server生成TGT,并通过TGT生成一个ST字符串

然后返回set-cookie(TGC)到浏览器并进行重定向回网站A(重定向URL携带ST,如:xxx.xxx.xxx/cas?token=$…)

网站A服务收到ST后去CAS-Server验证是否为自己签发的,若校验通过,则返回用户信息给网站A服务,然后网站A服务便可以基于拿到的用户信息,保存用户信息并构造属于自己应用的登录态,最后将登录态通过Set-Cookie或返回票据的方式给到前端,之后浏览器每一次发起对当前服务的请求,均会带上登录态信息

image-20221001130330291

第一次访问应用B

访问另一个接入CAS的网站B,网站B服务检测到用户没有登录态信息(如:Cookie),重定向到CAS-Server,中央认证服务判断第一次来(Cookie中有TGC,无需用户重复提交登陆凭证)

直接向CAS-Server申请一个ST令牌

CAS-Server通过TGTTGC生成ST令牌,通过嵌入到Response Header的Location的形式在浏览器重定向时给网站B服务

网站B服务收到ST后再去CAS-Server进行校验

image-20221001130437741

image-20221001130953051

业务应用的登录态维护

无论是上面所讲到的网站A还是网站B,接入CAS的用户身份校验流程后都需要自行维护自己应用的登录态

目前最常见的两种方案:

  • JWT
  • session

这里推荐一篇文章:juejin.cn/post/684490…

讲到最后

本文章简单介绍了一下CAS的全流程逻辑

谢谢大家,我们下节再见!!!

感谢各位看到这里,如果你觉得本节内容还不错的话,欢迎各位的点赞、收藏、评论,大家的支持是我做内容的最大动力

本文为作者原创,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利