你会觉得它们像,直觉非常敏锐。因为从用户体验上看,它们确实是一样的:用户输入账号密码,然后就进去了。
但在架构逻辑和信任边界上,它们有着本质的区别。你可以把它们理解为:“自己在家里开门”和“拿着房东给的钥匙去开不同的房间”。
1. 核心区别:密码交给了谁?
这是区分它们最关键的一点:
-
密码模式 (OAuth 2.0 Password Grant):
你把账号密码直接输入给了当前这个应用。
-
例子: 你在京东 App 里直接输入京东账号密码。
-
风险: 如果这个应用是第三方的(比如一个不知名的小 App 让你输微信密码),你的密码就泄露了。所以它只适用于自家产品。
-
-
SSO (单点登录):
你把账号密码输入给了一个独立的认证中心 (CAS/IDP),而不是当前应用。
-
例子: 你想上 YouTube,它把你跳到 Google 的登录页面。你输密码的对象是 Google,YouTube 拿不到你的密码,它只拿到一个“登录成功”的证明。
-
优势: 安全。无论有多少个子系统,你的密码永远只在认证中心输入。
-
2. 交互流程的“形态”不同
密码模式:直线型
用户 $\rightarrow$ 应用 (拿到密码) $\rightarrow$ 认证服务器 (换 Token)。
应用作为“中间人”,全程摸到了你的密码。
SSO / 授权码模式:三角形(重定向)
用户 $\rightarrow$ 应用 $\rightarrow$ [跳转] $\rightarrow$ 认证中心 (用户输密码) $\rightarrow$ [跳转回] $\rightarrow$ 应用。
应用被“绕过去”了,它只负责接收最终结果,不触碰敏感信息。
3. 为什么你会觉得它们像?
因为在现代企业架构中,大家经常把这两者混合使用,导致界限模糊:
-
产品全家桶: 公司内部有 A、B、C 三个系统。公司为了省事,可能在 A 系统里直接写个表单(密码模式)发给认证中心。这时候,密码模式实现了 SSO 的效果(一处登录,全处可用)。
-
App 原生登录: 很多手机 App 的登录界面是原生开发的,看起来是“密码模式”,但后台逻辑其实是走的安全加固后的 SSO 流程。
4. 总结对比
| 维度 | 密码模式 (Password Grant) | SSO (通常基于 OIDC/SAML) |
| 谁看得到密码 | 当前应用直接获取。 | 只有认证中心能看到。 |
| 适用范围 | 仅限“亲儿子”应用(高度信任)。 | 跨域、跨公司、第三方应用。 |
| 安全性 | 较低(密码暴露给应用)。 | 极高(密码不落地应用)。 |
| 主要目的 | 简化协议流程。 | 解决“多系统只登一次”的问题。 |
一句话点醒:
如果一个网站让你直接在它自己的框里输另一个平台的密码,那是“密码模式”;如果它弹出一个新窗口让你去另一个平台输密码,那是“SSO/授权码模式”。
你前年做的项目里,是不是因为那个 App 也是你们公司自研的,所以为了省事直接用了密码模式?