SSO 单点登录

微信公众号:[前端一锅煮]
一点技术、一点思考。问题或建议,请公众号留言。

前言

单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。

单点登录的本质就是在多个应用系统中共享登录状态。前后端分离项目中前端第一次登陆后会把登录凭证 Token 保存在本地浏览器,现在就要实现一个浏览器同时打开三个网站,一个网站登录了,另外两个也同时有登录状态。

父域 Cookie

Cookie 有一个特点,即父域中的 Cookie 被子域所共享,换言之,子域会自动继承父域中的 Cookie。

利用 Cookie 的这个特点,我们将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它们都建立在 baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。

总结:此种实现方式比较简单,但不支持跨主域名。

认证中心

我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立 Web 服务。

用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)

应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。

应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了。

实现过程:

  1. a 未登录跳认证中心,认证中心 cookie 中已有 token,直接携带 token 跳回 a
  2. 认证中心 cookie 无 token 跳登录,登陆过后自己存下 token,然后携带 token 跳回 a
  3. b 未登录跳认证中心,认证中心 cookie 中已有 token,直接携带 token 跳回 b

总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。

你可能感兴趣的:(javascript前端)