OAuth 2.0

授权框架:资源所有者授权客户端代表其访问资源;核心角色包括资源服务器、授权服务器与客户端;授权码模式配 PKCE 是交互式应用的推荐形态。

OAuth 2.0 是什么

OAuth 2.0 是一个授权框架:资源所有者授权客户端代表其访问受保护资源,核心角色包括资源服务器、授权服务器与客户端。它解决的是授权问题,不解决身份认证;把两者混用是协议选型中最常见的错误,需要认证能力时应叠加 OpenID Connect。

模式怎么选

有用户参与的交互式应用使用授权码模式并配合 PKCE,避免在公开客户端里存放密钥;服务之间的机器调用使用客户端凭证模式,此时没有用户上下文;输入受限的设备使用设备码模式,分设备授权与用户授权两步完成。隐式模式与密码模式因令牌泄露风险已不再推荐。

授权模式

模式适用要点
授权码加 PKCEWeb 与移动应用不暴露客户端密钥,防授权码拦截
客户端凭证服务间调用代表客户端自身,无用户上下文
设备码输入受限设备分设备与用户两步确认
隐式与密码模式已不推荐存在令牌泄露与凭据暴露风险

基本信息

令牌访问令牌有时效,刷新令牌用于续期
作用域按最小权限申请,避免一次授予全量
重定向地址必须严格白名单校验,防止被劫持
安全要求全程 HTTPS,携带状态参数,配合 PKCE

典型使用场景

  • 第三方登录授权:让用户授权客户端访问其账号数据
  • 第三方数据读取:按作用域限制可访问的资源范围
  • 企业内部单点登录:配合 OIDC 完成身份认证
  • 开放平台接口授权:给第三方应用发放受限凭据
  • 服务间机器调用:用客户端凭证获取服务身份令牌
OAuth 2.0 解决授权问题,认证问题由 OIDC 补充。区分两者可以避免协议选型混用,也能避免把访问令牌当成用户身份档案使用。

易错点

  • 移动端内嵌客户端密钥,等于把密钥公开泄露
  • 用密码模式替代授权码模式,把账号风险转嫁给应用
  • 重定向地址未做严格校验,授权码可被引导到攻击者控制的地址
  • 作用域一次申请全量权限,一旦令牌泄露影响面无法收敛

数据来源与参考

  • RFC 6749:OAuth 2.0
  • RFC 7636:PKCE
  • RFC 9700:OAuth 2.0 Security Best Current Practice
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌