25期 单点登录与CAS
Posted 海致前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25期 单点登录与CAS相关的知识,希望对你有一定的参考价值。
1. 前置知识
在阅读本文之前,需要对以下知识有所了解:
cookie和session、浏览器同源策略及跨域、登录系统的构成
2. SSO
SSO是英文Single Sign On 的缩写,直接翻译过来就是单点登录。
为什么需要单点登录,一般来说,一家公司会有几个Server,假如每个Server的账户系统不一样,那么用户在使用公司的不同Server就都需要注册登录,就好比你在使用豆瓣FM、豆瓣读书、豆瓣影评等等,每个都需要重复的进行登录,那该是有多么的崩溃。此时单点登录的作用就来了,单点登录就是让用户在一个Server钟登录后,进入其他的Server不用重新进行登录,登出也是一样的。
使用单点登录不仅可以提高用户体验,同时也可以避免重复开发,减轻我们开发人员的负担,所有业务都使用同一个登录系统,那么只需要维护这一份登录代码即可。
3. SSO的实现
3.1 同域名不同目录
此时不同业务系统可以直接拿到cookie,然后通过cookie去验证用户信息。
3.2 同父域
同父域只是同域名单点登录的简单升级,不同的是,需要把cookie写入父域之中。子域是可以拿到父域的cookie。此时本质上和同域sso是没有区别的。
3.3 跨域
当业务系统属于不同域的时候,cookie没法共享,就没法通过以上两种方法实现SSO了。下面就介绍解决这个问题的其中一个方案CAS。
4. CAS
4.1 CAS是什么
CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。
4.2 CAS术语
Client:客户端
Server:中心服务器,就是专门负责登录认证的服务器
Service:需要登录的各个服务,也就是不同的业务系统
4.3 票据
TGT:Ticket Grangting Ticket
TGT 是 CAS 为用户签发的登录票据,拥有了 TGT,用户就可以证明自己在 CAS 成功登录过。TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。当 HTTP 请求到来时,CAS 以此 Cookie 值(TGC)为 key 查询缓存中有无 TGT ,如果有的话,则相信用户已登录过。
TGC:Ticket Granting Cookie
CAS Server 生成TGT放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(SessionId),以 Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。
ST:Service Ticket
ST 是 CAS 为用户签发的访问某一 service 的票据。用户访问 service 时,service 发现用户没有 ST,则要求用户去 CAS 获取 ST。用户向 CAS 发出获取 ST 的请求,CAS 发现用户有 TGT,则签发一个 ST,返回给用户。用户拿着 ST 去访问 service,service 拿 ST 去 CAS 验证,验证通过后,允许用户访问资源。
为了保证ST的安全性:ST 是基于随机生成的,没有规律性。而且,CAS规定 ST 只能存活一定的时间,然后 CAS Server 会让它失效。而且,CAS 协议规定ST只能使用一次,无论 Service Ticket 验证是否成功, CASServer 都会清除服务端缓存中的该 Ticket ,从而可以确保一个 Service Ticket 不被使用两次。
4.4 简单场景
以上就是CAS的简单场景流程,然而,上面过程是没有考虑到前后端分离的情况的,在前后端场景下会存在一些坑。
5. 前后端分离与CAS
5.1 前后端分离的分类
a. 开发阶段使用dev-server,生产阶段是打包成静态文件整个放入后端项目中。
b. 开发阶段使用dev-server,生产阶段是打包成静态文件放入单独的静态资源服务器中。
这两种方案最大的区别就是生产阶段。由于第一种方案前端和后端本质在同一个服务中的,所以压根就没有跨域,配置cas的坑比较少。而第二种方案我们一般使用nginx反向代理完成跨域,配置cas的坑会很多。为了后面分析方便,我们分别称上述两种方案为『前后端分离A』和『前后端分离B』
5.2 请求分类
AJAX(XMLHttpRequest)请求:这是浏览器内部的XMLHttpRequest对象发起的请求,浏览器会禁止其发起跨域的请求,主要是为了防止跨站脚本伪造的攻击(CSRF)。
5.3 问题
问题1:前后端跨域导致前端cookie获取失败,解决方案: 保证cookie的域一致。
对于前后端分离A方案,本身就是没有跨域的,所以cookie没有跨域。对于前后端分离B方案来说就存在跨域的问题,通过反向代理,让前端和后端服务器或者SSO单点服务器存在于同一个根域下面,SSO服务器把cookie写入这个根域就可以保证cookie同域。
问题2:cookie过期,AJAX请求重定向失败,解决方案:重定向需要封装在状态200中,前端通过window.location进行重定向
只有HTTP请求才能进行重定向,ajax请求浏览器是无法进行重定向的,所以在前后端分离的项目中,后端需要对重定向结果进行封装,前端根据返回的结果进行页面跳转。
说到底,在前后端分离项目中,解决上面问题无非就是保证cookie同域,使用http请求进行重定向或者把重定向信息封装一下。
以上,就是本文的全部啦。由于水平和经验有限,如有纰漏或建议,欢迎留言。如果觉得不错,欢迎关注海致星图,谢谢您的阅读。
以上是关于25期 单点登录与CAS的主要内容,如果未能解决你的问题,请参考以下文章