浅谈单点登录

什么是单点登录

以百度为例,在一个baidu.com的域名下, 可以分出非常多的二级域名,用来开发其他技术平台,比如wenku.baidu.comtupian.baidu.com 。 如果每进入一个平台(系统)都需要重新登录一遍,那的确是非常繁琐,并且其中可能还有每个平台的策略不同,导致自己设置的密码页不同,以致经常遗忘密码。单点登录就是用来解决这种问题的,当我们在A平台上登录后,再去登录 B平台,C平台 都是不用再重新输入密码

为什么需要记住是访问

因为 HTPP 是无状态的连接,无论发送多少次请求,服务器都是当作一次新的请求来处理,如果每次请求一个新的资源的时候都需要重新登录一下,是不是很xx,所以需要去保存一下用户状态,但是HTTP又是无状态的,所以只能服务器 和 浏览器来扛起这个活。那么在浏览器中,用什么保存状态呢,有需要每次请求的时候,把这个状态带上

  • 拼接到 URL 中
  • 放在cookie 中

首先第一种解决方案,感觉上有点滑稽暂且不谈,
第二种解决方案是可行的,也的确在远古冲浪时期,用户的状态基本都是会存放在cookie 中,随着每次请求发送给server

单点登录过程

avator

首先将 sso认证中心 称为 sso server 在这里处理 认证服务,系统1,系统2,分别对应不同的子系统,浏览器就是我们发送请求的地方

  • 首先,浏览器发送 访问 系统1 的请求
  • 系统1 验证之后发现用户没有登录,就会携带系统一的地址 跳转到 sso认证中心
  • sso 认证中心会返回登录页面与 系统1的地址给用户(这里就是因为HTTP是无连接的,如果这不吧系统1的地址发过去(或者其他标识符),下次你发送请求过来,他无法识别这次请求对应的是系统1)
  • 用户吧用户名与密码发回给SSO 并且又回带上 系统1 的地址(无奈)
  • SSO 系统在数据库中检测用户名密码无误之后,就会创建一个全局对话,并且会创建一个令牌(令牌就是子系统用来验证用户是否登录的凭据),并且根据 重定向到 带过来的地址(系统1 终于派上用场了),并且会把令牌带上去
  • 系统1 接收到这个消息之后,就会 发送一个 检测用户是否登录的请求给sso认证中心,并且会把令牌与系统1地址带上,认证中心检测无误之后就会 返回有效,并且将令牌1的地址注册到当前已登录的地址中
  • 用户访问系统2时,系统2 发现用户未登录, 跳转sso ,并把自己地址作为参数
  • sso 发现用户已经登录了,跳转回 系统2地址,并且附上令牌
  • 系统2 拿到令牌,去sso 中检测是否有效
  • sso 验证令牌,返回有效, 注册系统2
  • 系统2使用改令牌与用户创建局部对话2

用户与 系统建立局部连接后,再次连接不再访问sso。

单点登录的注销步骤

既然有登录肯定也会有注销,当用户退出某一个站点后,需要在sso 中将注册的全部站点都退出,并且删除sso 中的认证信息

avatar

  • 用户请求注销系统1
  • 系统1 取出令牌, 想sso 发出注销请求
  • sso 接收到后,验证令牌有效性,销毁全局会话,取出注册系统
  • sso 向所有注册系统发出注销请求
  • 各注销系统接收到请求后,销毁局部会话
  • sso 重定向到登录页面 退出完成

为什么不能单独登出某一个应用

刚学习单点登录我也有疑惑,为什么不能单独退出某一个应用呢,我想了一下,这种情况无非就是退出某一个用户,登录另一个用户的情景,想到这里就知道了,在一个浏览器内,针对同一个域名,他的cookie 中针对用户的表示应该是一致的,如果我在整个系统中,系统1 登录的a 系统2 登录的b 那么在sso 中到底应该保存哪个用户的信息呢?所以矛盾的点应该是在这里

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享