单点登录:Single Sign On,是指在多个应用系统中,用户只需要登录任意一个系统,就可以访问其他的互相信任的系统,能有效提升用户体验
实现方式
同域下的单点登录
父域cookie
方式:
Cookie 的作用域由 domain 属性和 path 属性共同决定。domain 属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat 中,domain 属性默认为当前域的域名/IP地址。path 属性的有效值是以“/”开头的路径,在 Tomcat 中,path 属性默认为当前 Web 应用的上下文路径。
如果将 Cookie 的 domain 属性设置为当前域的父域,那么就认为它是父域 Cookie。Cookie 有一个特点,即父域中的 Cookie 被子域所共享,也就是说,子域会自动继承父域中的 Cookie。
利用 Cookie 的这个特点,可以将 Session Id(或 Token)保存到父域中就可以了。我们只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它们都建立在 baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
此种实现方式比较简单,但不支持跨主域名
认证中心(标准单点登录)
JWT(JSON Web Tokens)方案
登陆:
- 部署一个认证中心
【认证中心就是一个专门负责处理登录请求的独立的 Web 服务】 - 用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的)。
- 应用系统检查当前请求有没有 Token
- 如果没有token或失效,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心进行登录。
由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录。 - 如果发现用户已经登录过了,跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。
- 应用系统拿到 Token 之后,向认证中心确认下 Token 的合法性,防止用户伪造。
- 确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(这个 Cookie 是当前应用系统的,其他应用系统是访问不到的)
- 当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录。
退出登录:
某个产品 c.com 退出登录时
- 清空 c.com 中的登录态 Cookie。
- 请求认证中心 sso.com 中的退出 api。
- 认证中心遍历下发过 ticket(token) 的所有产品,并调用对应的退出 api,销毁局部会话,完成退出。
- sso认证中心引导用户至登录页面
此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。