OAuth 2.0,全称为“开放授权2.0”(Open Authorization 2.0),是一种开放标准的授权协议。

它允许用户授权第三方应用访问他们在另一个服务提供方上的数据,而无需分享他们的凭据(如用户名、密码)。
这一机制的目的是为了提供一个安全、高效的方法,让用户可以控制自己的数据共享,
同时允许第三方应用在获得用户授权的情况下访问这些数据。

一、OAuth2.0 的核心功能

1、授权委托

允许第三方应用通过用户授权访问其资源,避免直接暴露用户密码,提升安全性。

2、令牌机制

使用短期 access_token 和长期 refresh_token 管理权限,支持动态范围和时效控制。

3、权限控制

通过 scope 参数定义细粒度权限(如仅读取用户基本信息或邮件)。

4、多客户端支持

适配 Web、移动端、单页应用等场景,提供四种授权模式灵活应对不同需求。

二、OAuth2.0 的典型使用场景

1、第三方登录

用户使用微信、QQ 等账号登录其他应用(如京东),无需重复注册。

2、API 访问控制

开放平台(如阿里云)通过 OAuth2.0 管理第三方开发者对用户资源的访问权限。

3、微服务鉴权

服务间调用使用客户端模式(Client Credentials)进行身份认证,避免硬编码密码。

4、企业内部系统集成

高信任环境(如内网工具)使用密码模式快速授权。

三、OAuth2.0 四种授权模式的区别与选型

1. 授权码模式(Authorization Code Grant)

  • 流程:用户授权 → 获取授权码 → 后端用授权码换取令牌。
  • 安全性:最高,令牌通过后端传输,避免前端暴露。
  • 场景:有后端的 Web 应用(如电商网站)、需长期会话管理的服务。

2. 简化模式(Implicit Grant)

  • 流程:用户授权后直接返回令牌(无授权码)。
  • 安全性:较低,令牌通过 URL 传递,易被中间人攻击。
  • 场景:纯前端应用(如单页应用 SPA)、临时授权场景。

3. 密码模式(Resource Owner Password Credentials)

  • 流程:用户直接提供账号密码,客户端换取令牌。
  • 安全性:最低,用户凭证直接暴露给客户端。
  • 场景:高度信任的内部系统(如企业内网工具)、快速原型开发。

4. 客户端模式(Client Credentials Grant)

  • 流程:客户端使用自身凭证直接获取令牌(无需用户参与)。
  • 安全性:中等,适用于服务间通信。
  • 场景:微服务 API 调用(如日志服务调用短信服务)、自动化脚本。

四、模式选型对比与建议

维度授权码模式简化模式密码模式客户端模式
适用客户端后端 Web 应用纯前端应用(如 SPA)高信任内部应用服务间通信
安全性高(授权码一次性传递)低(令牌暴露在 URL)低(需用户明文密码)中(依赖客户端凭证)
用户参与需用户授权需用户授权需提供凭证无需用户参与

选型原则:

1. 优先授权码模式:适用于大多数场景,安全性最高。

2. 简化模式慎用:仅在无法安全存储 client_secret 时使用(如纯前端)。

3. 密码模式限内部:仅限完全信任的环境。

五、常见面试题

1、OAuth2.0 的四个角色是什么?

资源所有者(用户)、客户端、授权服务器、资源服务器。

2、为什么授权码模式需要两次请求(授权码 + 令牌)?

防止令牌通过浏览器直接暴露,提升安全性。

3、双令牌机制(access_token + refresh_token)的作用?

access_token 短期有效,减少泄露风险;refresh_token 长期有效,用于续签令牌。

4、如何防御 CSRF 攻击?

使用 state 参数校验请求来源的合法性。

5、密码模式的安全隐患是什么?

用户密码直接暴露给客户端,存在泄露风险。

6、OAuth2.0 与 OAuth1.0 的主要区别?

OAuth2.0 简化流程、支持多种授权模式,但不再兼容 OAuth1.0。

7、隐式模式与授权码模式的核心区别?

隐式模式无授权码步骤,令牌直接返回给前端,适用于无后端场景。

8、如何实现 Token 自动刷新?

客户端定期检查 access_token 有效期,通过 refresh_token 调用授权接口续签。

9、为何不能仅依赖访问令牌的过期时间?

1、无法处理令牌主动失效的情况
访问令牌可能因用户主动撤销、系统安全策略调整等原因提前失效,
此时仅通过过期时间判断无法感知令牌的实际有效性,必须通过刷新令牌重新验证身份。

2、缺乏客户端认证环节
直接使用过期时间判断后刷新,可能绕过客户端身份验证(如client_secret),
而刷新令牌的申请需同时提交客户端凭证,确保请求来源合法。

3、用户体验与效率问题
若仅依赖过期时间,客户端需频繁向资源服务器发起请求以验证令牌状态,增加网络开销;
而刷新令牌机制通过授权服务器集中管理令牌生命周期,效率更高。

六、总结

OAuth2.0 通过灵活的授权模式解决了第三方应用安全访问资源的问题。

实际开发中需根据客户端类型、安全需求和信任关系选择模式,优先使用授权码模式保障安全性。

面试中需重点掌握模式差异、安全机制和典型场景,

结合流程图和代码示例(如 Spring Security 配置)可增强理解。

高旭
40 声望3 粉丝