真正的单点登录,可以通过 CAS 来设计,集中认证服务,也就是认证是由一个独立的域名提供的网页认证服务(也是一个系统,认证中心)。
多个域名共享Cookie,在写到客户端的时候设置Cookie的domain。也就是说需要一个地方设置哪些域名是可以共享Cookie,也就是单点登录的所有系统的域名。
这个过程和微信公众号的网页认证一样,流程描述如下:
现在有两个应用系统(www.java3y.com
和www.java4y.com
)和一个认证系统(www.sso.com)
首先,用户想要访问系统Awww.java3y.com
受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统Awww.java3y.com
发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:
www.sso.com?service=www.java3y.com
sso认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)
随后,认证中心重定向回系统A,并把Token携带过去给系统A,重定向的地址如下:
www.java3y.com?token=xxxxxxx
接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。
此时,用户想要访问系统Bwww.java4y.com
受限的资源(比如说订单功能,订单功能需要登录后才能访问),系统Bwww.java4y.com
发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数。请求的地址如下:
www.sso.com?service=www.java4y.com
注意,因为之前用户与认证中心www.sso.com
已经建立了全局会话(当时已经把Cookie保存到浏览器上了),所以这次系统B重定向到认证中心www.sso.com
是可以带上Cookie的。
认证中心根据带过来的Cookie发现已经与用户建立了全局会话了,认证中心重定向回系统B,并把Token携带过去给系统B,重定向的地址如下:
www.java4y.com?token=xxxxxxx
接着,系统B去sso认证中心验证这个Token是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。
CAS官网上的标准流程如下: