CAS:中央认证服务(Central Authentication Service)。
SSO:单点登录(Single Sign On)。

当一个账号能需要登录多个系统时,比如用新浪微博登录新浪官网、邮箱等,是不需要反复输入账号密码登录的,其背后的实现机制就是SSO。

中央认证服务是SSO常见的实现方式,抽一个服务专门负责登录,并向各个子系统提供登录认证。

1.未登录用户首次访问目标系统

此时cookie非常干净,目标系统没检索到任何登录信息,视为未登录状态,重定向到中央登录系统,重定向URL参数带上目标系统的信息,如系统id(后续使用)、地链接址(用于登陆后回调)。

2.用户登录

用户通过输入账号密码,提交到中央系统,密码正确后,视为登录成功,此时中央系统检索出用户的身份信息,以此生成特定cookie种在中央系统的域名下(而非目标登录系统),除了种这个重要及其cookie,还会产生一个code凭据,这个code是根据目标系统生成的,仅针对当前要访问的目标系统有效,且只一次性,验证后立马无效。

此时中央系统返回一个重定向到目标系统的链接,把code凭据作为参数挂载后面,除了code还有登录标志参数,利于目标系统检索判断其目的是登录。

二次访问目标系统

根据中央系统的重定向链接和code等登录相关参数,浏览器二次访问目标系统,系统检索到到登录标识且有code,则取code向中央系统验证,换取accessToken,如上所述,换取后code凭据立马失效,这一步的安全保障在于:

  • 请求发生在服务器和服务器之间
  • https加密链接
  • 有BA验证
  • code一次性

用accessToken换取用户信息

目标服务器拿刚换取到的accessToken再次发起请求换取用户信息,如:姓名、id、邮箱等。这一步的保障在于:

  • 服务器请求服务器
  • https
  • 有BA

目标服务器总算拿到了用户信息,到这里中央认证在登录这一块的基本任务就完整成了,因为如何保存和处理用户信息是目标服务器的事了,只要和前端浏览器约定好登录验证方案即可,这里多种实现,有常规方案session和目前常见的JWT。

这里说一下JWT。

JWT (JSON Web Token)

目标系统根据用户信息以及accessToken(为什么也要包含accessToken?后续退出会说到)进行签名加密成一个token(密钥只有服务器知道),返回给前端浏览器,浏览器后续的请求都带上这个token来作为登录标志,所以后续没放目标系统收到请求中的token都会先解密出用户信息后,才会进行后续逻辑中间件的处理。JWT还有很多细节,最大的特点就是和浏览器器传输一个token密码,免去服务端保存一份用户信息,从而实现无状态的目的,减轻服务端保存session的压力和响应速度。

把token交给前端和后续请求带上token有两种方案:

  • 作为重定向的参数
  • 种cookie

请求带上token也有相应的两种(其实参数也能带,但肯定没人这么做):

  • 放在请求头中
  • 作为cookie

这里整个登录流程就已经实现,下面说一下退出流程。

退出

退出请求依然会带上token,根据token解密出登录信息和上述accessToken,拿accessToken去请求中央服务器的退出接口声明废弃此accessToken,然后清除cookie,如果cookie内容是token的话也就是清除了token,并在响在重定向到最开始的登录页或其他你想要的页面。