OAuth 2.0 学习笔记
什么是 OAuth 2.0
OAuth 全名是 Open Authorization,OAuth 2.0 是一个授权框架,允许第三方应用在不获取用户密码的情况下,获取对用户资源的有限访问权限。它解决了"如何让第三方应用安全获取用户数据"的问题。
授权流程基本步骤
OAuth 2.0 中的四个角色:
- 资源所有者(Resource Owner):通常是用户本人,拥有受保护资源的实体
- 客户端(Client):第三方应用,需要获取用户资源的应用程序
- 授权服务器(Authorization Server):负责验证资源所有者身份并颁发访问令牌
- 资源服务器(Resource Server):存储受保护资源的服务器,接受并验证访问令牌
授权的基本步骤:
- 客户端请求资源所有者的授权
- 资源所有者同意授权
- 客户端使用授权凭证向授权服务器请求访问令牌
- 授权服务器验证授权凭证并颁发访问令牌
- 客户端使用访问令牌向资源服务器请求受保护资源
- 资源服务器验证访问令牌并提供资源
授权模式(Grant Types)
OAuth 2.0定义了四种主要的授权模式,适用于不同场景:
授权码模式(Authorization Code)
最完整、最安全的流程,适用于有后端的网站应用。
特点:
- 令牌不经过浏览器,安全性高
- 支持刷新令牌机制
- 客户端必须能够保密客户端凭证(有后端)
隐式授权模式(Implicit)
针对无法保存客户端密钥的应用(如纯前端应用)。
特点:
- 简化流程,省略了授权码步骤
- 令牌暴露在浏览器中,安全性较低
- 不支持刷新令牌
- 适用于纯浏览器应用
密码模式(Resource Owner Password Credentials)
用户向客户端提供自己的用户名和密码。
特点:
- 需要高度信任的应用,通常为第一方应用
- 用户直接将密码提供给客户端,风险较高
- 适用于无法使用其他流程的场景
客户端模式(Client Credentials)
客户端以自己的名义获取访问令牌,不代表用户。
特点:
- 没有用户参与,适用于服务器间通信
- 访问的是客户端自己的资源,不是用户资源
- 适用于微服务架构、后台API调用等场景
选择适当的授权模式
授权模式 | 适用场景 | 安全性 |
授权码模式 | 有后端的Web应用 | 最高 |
隐式授权模式 | 纯前端应用、SPA | 中等 |
密码模式 | 高度可信的第一方应用 | 较低 |
客户端模式 | 服务器间通信 | 视实现而定 |
令牌类型
访问令牌(Access Token)
- 用于访问受保护的资源
- 有效期较短(通常几小时或几天)
- 形式多样,常见为JWT格式
刷新令牌(Refresh Token)
- 用于获取新的访问令牌
- 有效期较长
- 需要安全存储,不应暴露给前端
刷新令牌流程
实际应用场景
- 社交登录:使用Google、Facebook等账号登录第三方网站
- API 访问授权:允许第三方应用访问平台API
- 企业应用集成:企业内部各系统之间的授权访问
- 移动应用授权:移动应用获取云服务资源的授权
安全最佳实践
- 使用HTTPS:所有OAuth通信必须使用HTTPS加密
- 验证重定向URI:严格检查重定向URI,防止授权码被截获
- 使用随机状态参数:在授权请求中添加state参数,防止CSRF攻击
- 有限的令牌权限:使用scope参数限制令牌权限范围
- 短期访问令牌:设置合理的访问令牌有效期
- 安全存储令牌:客户端安全存储令牌,避免泄露
常见问题和解决方案
- 令牌泄露:使用短期令牌、实施令牌撤销机制
- 权限过大:细化scope参数,实现最小权限原则
- 钓鱼攻击:验证应用身份,使用state参数防CSRF
- 重放攻击:实施nonce机制,每个请求使用一次性值
与 Auth0 的区别
OAuth 2.0
- 一种授权框架和开放标准
- 定义了不同应用之间安全授权的协议规范
- 仅提供授权机制,不处理认证
- 开发者需要自行实现OAuth 2.0服务器和相关功能
Auth0
- 一个基于OAuth 2.0 和 OpenID Connect 构建的身份管理平台
- 提供即用即付的身份即服务(IDaaS)解决方案
- 除了OAuth 2.0授权,还包含用户认证、身份管理、单点登录等功能
- 内置了社交登录、多因素认证、用户管理、监控等企业级功能
何时选择 Auth0
- 需要快速集成身份认证功能
- 需要支持多种认证方式和社交登录
- 没有足够资源自行维护复杂的身份系统
- 需要企业级的安全性和合规性功能
何时选择自建 OAuth 2.0
- 需要完全控制授权流程
- 有特殊的定制化需求
- 对成本敏感,有能力自行维护
- 只需要简单的授权功能,不需要完整的身份管理