知识卡片

OAuth 2四种授权模式对应的信任层级差异

结构图卡

内容

OAuth 2的核心思路是用令牌(Token)代替密码作为授权凭证——令牌泄漏不会 连带泄漏密码、可以限定访问范围和有效期、每个第三方应用独立持有互不影响。 四种授权模式对应四种不同的”第三方到底有多可信”的现实场景。授权码模式 最严谨:第三方应用必须有自己的应用服务器,先拿一次性授权码,再用授权码 加只有自己知道的ClientSecret去换令牌,即使授权码在浏览器跳转中暴露, 没有ClientSecret也换不到令牌——适合有服务端支撑的正规第三方应用(如 Travis-CI访问GitHub)。隐式授权省去授权码换令牌这一步、令牌直接经浏览器 Fragment回传,适合没有应用服务器的纯前端应用(PWA),代价是不再验证 第三方身份、禁止发放刷新令牌,安全性明显降低。密码模式把认证和授权 合并成一步,第三方直接拿用户密码去换令牌,只有当”第三方”在逻辑上本就是 系统自身一部分时才合理(如Fenix’s Bookstore的前端和账号服务)。客户端 模式最简单,压根没有”资源所有者”这个角色,第三方以自己的名义申请资源 (如定时清理超时未付款订单的服务),常用于微服务间的服务对服务认证。 四种模式呈现一条清晰的”信任程度递减、安全代价递增”的谱系。

结构图

flowchart TD
    A["授权码模式<br/>需应用服务器+ClientSecret<br/>最严谨"] -->|信任度降低, 无服务器场景| B["隐式授权模式<br/>令牌经Fragment直传<br/>禁用刷新令牌"]
    B -.用途不同, 认证授权合一.-> C["密码模式<br/>第三方直接拿密码换令牌<br/>要求第三方本就是系统一部分"]
    D["客户端模式<br/>无资源所有者, 第三方以自己名义申请<br/>适合服务间认证"]

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第5章"架构安全性" 5.2.2节"OAuth 2"(源文件:_epub-src对应OEBPS/Text/chapter62.xhtml) - 结论依据:原文详述授权码模式需应用服务器和ClientSecret、隐式授权省去 服务端支持但禁用刷新令牌、密码模式要求第三方逻辑上属于系统一部分、 客户端模式没有资源所有者角色,直接支撑本卡片对四种模式信任层级的 分类梳理。 - 原始内容:只要第三方应用妥善保管好ClientSecret,就没有人能够冒充 它……代价是在隐式授权中,授权服务器不会再去验证第三方应用的身份…… 如果要采用密码模式,那"第三方"属性就必须弱化……客户端模式是指第三方 应用以自己的名义,向授权服务器申请资源许可。