数据安全流:彻底搞名单点登录 (SSO) 与鉴权体系

场景题: “大公司内部有非常多系统,比如 OA、HR 系统、代码库等。如果员工要在办公的每天登十几遍密码那太崩溃了。 从技术和认证协议角度讲讲,如何打通这些应用,使用户‘在所有同网产品矩阵里能实现一次登录,全线免密畅通无阻’(Single Sign-On SSO)?”

前端极其容易栽这道题。如果多个不同且各异的域名,例如公司旗下的 a.com, b.com,想要靠“前端在登录时存个巨无霸 Cookie 设置顶级主域通过 domain=.com 以让全部系统读”来偷懒。这只是同站不同子域级的降级妥协产物!这极不安全,且面对毫无前缀关系的 a.alibaba 与 b.taobao,不仅完全不可行受制死限制,更毫无扩展安全性。

主流大厂、业界成熟的**CAS(Central Authentication Service,核心授权中心)**标准架构思路如下:

基于独立认证服务器的重定向授权流

既然不能互通,我们就人为地切出来一栋唯一的、绝对的独立的认证高楼:名叫 sso-login.company.com(后面简称为 SSO),我们把真正用来输账号密码或者扫码确认识别身份的操作全部搬运到这个地址发生。其它各个子应用(无论是系统 A 抑或系统 B),自己不干认证,通通做被保送者!

时序剖面与交互流水大戏

假设当前用户去系统 APP-A (www.app-a.com) 请求查个内部的工资单。以下将以时间线展现:

【无功而返,强行押送期】

  1. 用户的网页直奔 www.app-a.com,A 的前端试图请求拿数据,但请求发给后台后被发现没身份不认识!打回响应状态重拳 401 Unauthorized
  2. A系统前端立即劫持捕捉:将浏览器页面直接用大招重定向(window.location.href = sso-login...)飞抵真正的登录总署服务器。并故意带上回程车票参数(用来让系统知道完事了把我扔哪去)?redirectURL=www.app-a.com

【大总管 SSO 中心认亲发牌期】 3. 用户在到达了真正属于安全认证的 SSO 官网上,填写并认证其正确的身份通过后。 4. 【极度核心】 SSO 服务器此刻做出了两个伟大且举足轻重的底层运作:

  • 第一件:它在这属于 SSO 自己管辖域名下浏览器内的客户端种入大内令牌 Cookie 或记录!(这保证了下回不管是任何人经过该中心大厅,中心知道他其实处于大赦天下已登录保护状态)
  • 第二件:生成了一张极短时间(比如 3分钟)有效的、一次性的**“临时出入圣旨(又名 Ticket 或者 Code)”**。
  1. SSO 系统一脚把这名用户重新踹了回去进行大转移!(302 重定位发配回他一开始来的时候写下的那个 redirectURL 地址,并在 URL 尾巴上绑上传国玉玺!也就是 www.app-a.com?ticket=TICKET_7sdakjh

【带着通行凭证重获新生期】 6. 这次 A 系统大门的保安可不敢马虎!前端一被重放落地点,立马拿到大参数提取 ?ticket=xxxx,立即向着自己的服务端 APP-A 后端发起请求拿真实的信息:我要用这卷圣旨换一个进入 A 系统独有受持用的长生身份! 7. APP-A 后端拿了这张极其隐秘单次卷,它是没有甄别能力的。A 后台立刻从极其安全的内网通道,派急行快马直接与中心大内 SSO 服务端核实比对这张卷宗真假(也就是底层服务端之间的握手)。 8. SSO 后端 摸了一下确认无误,且把这个人真正叫李明并工号 201 顺风车告知。 9. 最终 APP-A 后端直接给出了自家辖区大局域内行走的护身符:针对 APP-A 下发的业务级长生存活令牌(基于业务产生的专属 Token 甚至 Session)。 10. 用户的前端终于将其记录下!免登录一马平川享受畅意人生!

真正精妙的是系统 B 登场了的“免登录魔法”

试想,李明在 A 这边上着班。随手点开了公司内的请假中心 APP-B 大门。

  1. B 的大门不出所料因为李明没戴识别牌无情拦截它,并遵循古法的祖制原班照抄步骤,把他同样狠狠踢重定位飞去了 SSO 大管家登录中心 去要 Ticket。

  2. 但这一次:魔法发生了!

  3. 李明的浏览器到达 SSO 大厅后。你还记得上一次吗?大总管中心服务器上次为了纪念,在这个专属的域名留下了最高级别种入的证明!此刻浏览器自发带着它到达了大殿(自动跨上了它辖区特有的无敌 Cookie)。

  4. SSO 服务器 一把捏过参数,“好小伙原来是你,你处于我们这登录期。”,根本无需任何重新展示密码输入的大画面(页面可能一闪而过全白,甚至还没渲染出来视觉)!!直接在毫秒内凭单给系统 B 飞速签发了又一次**“临时出入圣旨(又名 Ticket B)”**。

  5. 一顿 302 高度原班的抛沙与服务端握手……

  6. 李明震惊了,“我就点了一下新网站,没有任何闪动密码输窗!我竟然自己登进去了?”

—— 这就是 跨越物理疆域阻绝的、依靠全局大中心凭据核实流流放的:Single Sign-On,无双的终极神力。

面试高阶指引(拔高项)

当聊完这无比繁复且精彩的时序推演。如果面试官问及:目前如果全网都在抛弃极度臃肿不友善的老式 CAS。这套理论有什么变种吗?怎么做得更为强大规范? 可以直接对标回答业界公认极难、极其深厚且正在推向公用大厂最常被提起的理论护城河框架:OAuth 2.0(包含如授权码模式 Authorization Code)与 OIDC(OpenID Connect 接入底层 JWT 支持)!微信授权三方登录,其底层骨架也全是对类似时序的高度变体与封装发散。将系统认证授权脱出“我们自己野路子的实现”,上升道标准协议规范级别去压制面试。