avatar

OAuth 2.0 学习笔记

什么是 OAuth 2.0

OAuth 全名是 Open Authorization,OAuth 2.0 是一个授权框架,允许第三方应用在不获取用户密码的情况下,获取对用户资源的有限访问权限。它解决了"如何让第三方应用安全获取用户数据"的问题。

授权流程基本步骤

OAuth 2.0 中的四个角色:

  1. 资源所有者(Resource Owner):通常是用户本人,拥有受保护资源的实体
  2. 客户端(Client):第三方应用,需要获取用户资源的应用程序
  3. 授权服务器(Authorization Server):负责验证资源所有者身份并颁发访问令牌
  4. 资源服务器(Resource Server):存储受保护资源的服务器,接受并验证访问令牌

授权的基本步骤:

  1. 客户端请求资源所有者的授权
  2. 资源所有者同意授权
  3. 客户端使用授权凭证向授权服务器请求访问令牌
  4. 授权服务器验证授权凭证并颁发访问令牌
  5. 客户端使用访问令牌向资源服务器请求受保护资源
  6. 资源服务器验证访问令牌并提供资源

授权模式(Grant Types)

OAuth 2.0定义了四种主要的授权模式,适用于不同场景:

授权码模式(Authorization Code)

最完整、最安全的流程,适用于有后端的网站应用。

特点

  • 令牌不经过浏览器,安全性高
  • 支持刷新令牌机制
  • 客户端必须能够保密客户端凭证(有后端)

隐式授权模式(Implicit)

针对无法保存客户端密钥的应用(如纯前端应用)。

特点

  • 简化流程,省略了授权码步骤
  • 令牌暴露在浏览器中,安全性较低
  • 不支持刷新令牌
  • 适用于纯浏览器应用

密码模式(Resource Owner Password Credentials)

用户向客户端提供自己的用户名和密码。

特点

  • 需要高度信任的应用,通常为第一方应用
  • 用户直接将密码提供给客户端,风险较高
  • 适用于无法使用其他流程的场景

客户端模式(Client Credentials)

客户端以自己的名义获取访问令牌,不代表用户。

特点

  • 没有用户参与,适用于服务器间通信
  • 访问的是客户端自己的资源,不是用户资源
  • 适用于微服务架构、后台API调用等场景

选择适当的授权模式

授权模式适用场景安全性
授权码模式有后端的Web应用最高
隐式授权模式纯前端应用、SPA中等
密码模式高度可信的第一方应用较低
客户端模式服务器间通信视实现而定

令牌类型

访问令牌(Access Token)

  • 用于访问受保护的资源
  • 有效期较短(通常几小时或几天)
  • 形式多样,常见为JWT格式

刷新令牌(Refresh Token)

  • 用于获取新的访问令牌
  • 有效期较长
  • 需要安全存储,不应暴露给前端

刷新令牌流程

实际应用场景

  1. 社交登录:使用Google、Facebook等账号登录第三方网站
  2. API 访问授权:允许第三方应用访问平台API
  3. 企业应用集成:企业内部各系统之间的授权访问
  4. 移动应用授权:移动应用获取云服务资源的授权

安全最佳实践

  1. 使用HTTPS:所有OAuth通信必须使用HTTPS加密
  2. 验证重定向URI:严格检查重定向URI,防止授权码被截获
  3. 使用随机状态参数:在授权请求中添加state参数,防止CSRF攻击
  4. 有限的令牌权限:使用scope参数限制令牌权限范围
  5. 短期访问令牌:设置合理的访问令牌有效期
  6. 安全存储令牌:客户端安全存储令牌,避免泄露

常见问题和解决方案

  1. 令牌泄露:使用短期令牌、实施令牌撤销机制
  2. 权限过大:细化scope参数,实现最小权限原则
  3. 钓鱼攻击:验证应用身份,使用state参数防CSRF
  4. 重放攻击:实施nonce机制,每个请求使用一次性值

与 Auth0 的区别

OAuth 2.0

  • 一种授权框架开放标准
  • 定义了不同应用之间安全授权的协议规范
  • 仅提供授权机制,不处理认证
  • 开发者需要自行实现OAuth 2.0服务器和相关功能

Auth0

  • 一个基于OAuth 2.0 和 OpenID Connect 构建的身份管理平台
  • 提供即用即付的身份即服务(IDaaS)解决方案
  • 除了OAuth 2.0授权,还包含用户认证、身份管理、单点登录等功能
  • 内置了社交登录、多因素认证、用户管理、监控等企业级功能

何时选择 Auth0

  • 需要快速集成身份认证功能
  • 需要支持多种认证方式和社交登录
  • 没有足够资源自行维护复杂的身份系统
  • 需要企业级的安全性和合规性功能

何时选择自建 OAuth 2.0

  • 需要完全控制授权流程
  • 有特殊的定制化需求
  • 对成本敏感,有能力自行维护
  • 只需要简单的授权功能,不需要完整的身份管理