不管是什么公司,只要产品数量大于一个,那么单点登录势必是绕不过去的一个问题。作为前端程序员,我们对其虽然接触不多,但适当的了解还是必要的。本文就来谈谈单点登录相关的问题。
前置知识
了解SSO,最好具备以下知识。当然,如果不是特别熟,也不影响阅读。
cookie及session
浏览器同源策略及跨域
了解登录系统的构成
什么是SSO与CAS?
SSO
SSO是英文SingleSignOn的缩写,翻译过来就是单点登录。顾名思义,它把两个及以上个产品中的用户登录逻辑抽离出来,达到只输入一次用户名密码,就能同时登录多个产品的效果。
使用SSO的优点很明显:
提升用户体验。就以我厂为例。我厂有两个产品,丁香人才网和丁香园论坛,假如你是我厂用户,肯定无法忍受登录丁香园论坛的时候输入一次用户名密码,登录人才网又要输入一次用户名密码吧?
避免重复开发。假如你是我厂后端,每天任务都饱和的不行,肯定无法忍受到人才网开发一套登录逻辑,到论坛又开发一套登录逻辑吧?
提升安全系数
假如你是我厂运维,发现了一个安全隐患需要紧急修复。你肯定无法忍受给茫茫多的产品后端都发一封邮件,责令修复吧?万一漏了一个呢?
CAS
SSO仅仅是一种架构,一种设计,而CAS则是实现SSO的一种手段。两者是抽象与具体的关系。当然,除了CAS之外,实现SSO还有其他手段,比如简单的cookie。CAS(CentralAuthenticationService)中心授权服务,本身是一个开源协议,分为1.0版本和2.0版本。1.0称为基础模式,2.0称为代理模式,适用于存在非Web应用之间的单点登录。
同域SSO如图,同域SSO是最简单的一种情况。此时,两个产品都是在一个域名下,单点登录是很自然的选择。我们来捋一捋步骤,搞清楚这里的步骤是理解后文的基础,千万不要跳过。
用户访问产品a,向后台服务器发送登录请求。
登录认证成功,服务器把用户的登录信息写入session。
服务器为该用户生成一个cookie,并加入到responseheader中,随着请求返回而写入浏览器。
该cookie的域设定为dxy.cn。
下一次,当用户访问同域名的产品b时,由于a和b在同一域名下,也是dxy.cn,浏览器会自动带上之前的cookie。此时后台服务器就可以通过该cookie来验证登录状态了。
实际上,这种场景就是最简单最传统的登录操作。虽然我们把产品a和b人为分开了,但由于它们在同域上,就算看成是同一产品的不同类目也未尝不可。我们没有设置独立的SSO服务器,因为业务后台服务器本身就足以承担SSO的职能。
同父域SSO
同父域SSO是同域SSO的简单升级,唯一的不同在于,服务器在返回cookie的时候,要把cookie的domain设置为其父域。比如两个产品的地址分别为a.dxy.cn和b.dxy.cn,那么cookie的域设置为dxy.cn即可。在访问a和b时,这个cookie都能发送到服务器,本质上和同域SSO没有区别。
.跨域SSO
可以看到,在上面两种情况下,我们都没有专门设置SSO服务器。但是当两个产品不同域时,cookie无法共享,所以我们必须设置独立的SSO服务器了。这个时候,我们就是通过标准的CAS方案来实现SSO的。
详解CAS
CAS1.0协议定义了一组术语,一组票据,一组接口。
术语:
Client:用户。
Server:中心服务器,也是SSO中负责单点登录的服务器。
Service:需要使用单点登录的各个服务,相当于上文中的产品a/b。
/login:登录接口,用于登录到中心服务器。
/logout:登出接口,用于从中心服务器登出。
/validate:用于验证用户是否登录中心服务器。
/serviceValidate:用于让各个service验证用户是否登录中心服务器。
给大家推荐一个web前端学习群,群里有海量资料,每天都有技术大牛分享最前沿的前端案例,大家一起学习一起进步。