OAuth 2.0 详解:现代授权的核心协议

1. 什么是OAuth?

OAuth(Open Authorization)是一种开放授权标准,允许用户在不共享密码的情况下,授权第三方应用访问其存储在另一服务中的数据。

核心思想

  • "用Token代替密码" :第三方应用获取访问令牌(Access Token),而非用户的真实密码。
  • 限制权限:用户可精细控制授权范围(如仅允许读取邮件,不允许删除)。

举例

你用Google账号登录某网站,该网站可以获取你的Gmail联系人,但不需要知道你的Google密码。


2. OAuth 2.0 核心角色

角色 说明 示例
资源所有者 (Resource Owner) 拥有数据权限的用户 你(用户)
客户端 (Client) 请求访问数据的应用 某博客网站
授权服务器 (Authorization Server) 颁发Token的服务 Google登录服务器
资源服务器 (Resource Server) 存储用户数据的API Google Contacts API

3. OAuth 2.0 四种授权模式

根据场景不同,OAuth 2.0 定义了4种授权方式:

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

最安全,适用于有后端的Web应用。
User 客户端(博客网站) 授权服务器(Google) GoogleAPI 1. 点击"用Google登录" 2. 重定向到Google授权页 3. 登录并同意授权 4. 返回授权码(Code) 5. 提交Code 6. 用Code换Token 7. 返回Access Token 8. 用Token访问数据 User 客户端(博客网站) 授权服务器(Google) GoogleAPI

特点

  • 需要 client_secret(后端存储,避免泄露)
  • 支持 refresh_token 刷新Token

(2) 隐式模式(Implicit)

已淘汰,适用于纯前端SPA(现代推荐用PKCE替代)。
User SPA应用 授权服务器 1. 点击登录 2. 重定向到授权页 3. 登录授权 4. 直接返回Access Token(URL片段) 5. 提取Token User SPA应用 授权服务器

风险:Token暴露在浏览器历史记录中。


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

高度信任场景使用(如自家App登录自家服务)。
User 客户端App AuthServer 1. 输入用户名/密码 2. 直接发送密码换Token 3. 返回Access Token User 客户端App AuthServer

警告:需绝对信任客户端(如银行官方App)。


(4) 客户端凭证模式(Client Credentials)

机器对机器(M2M)认证,无用户参与。
服务端脚本 AuthServer 1. 用client_id+secret换Token 2. 返回Access Token 服务端脚本 AuthServer

用途:后台服务调用API(如定时同步数据)。


4. OAuth 2.0 安全增强:PKCE

PKCE(Proof Key for Code Exchange) 用于防止授权码被拦截(如移动端/SPA)。

PKCE流程

  1. 客户端生成code_verifier(随机字符串)`。
  2. 客户端计算code_challenge=S256(code_verifier)
  3. 授权请求时带上 code_challenge
  4. 返回authorization_code
  5. 换Token时提交 code_verifier,服务器验证匹配性。
  6. 验证code_challenge匹配性
  7. 返回access_token

作用 :即使黑客截获 authorization_code,也无法换取Token。
客户端(SPA/App) 授权服务器 1. 生成code_verifier(随机字符串) 2. 计算code_challenge=S256(code_verifier) 3. 授权请求(+code_challenge) 4. 返回authorization_code 5. 用code+code_verifier换Token 6. 验证code_challenge匹配性 7. 返回access_token 客户端(SPA/App) 授权服务器


5. OAuth 2.0 vs. OAuth 1.0

特性 OAuth 1.0 OAuth 2.0
复杂性 高(签名计算复杂) 低(HTTPS+Token即可)
适用场景 仅Web Web/App/API
安全性 签名防篡改 依赖HTTPS+PKCE
现状 已淘汰 行业标准

6. OAuth 2.0 的Token类型

Token类型 用途 有效期
Access Token 访问资源API 短(1小时)
Refresh Token 刷新Access Token 长(几天)
ID Token (OIDC) 用户身份信息(JWT格式) 可变

7. 实际案例:微信登录流程

  1. 用户点击"微信登录"。
  2. 网站重定向到微信OAuth页(带 appid+redirect_uri)。
  3. 用户扫码确认授权。
  4. 微信返回 code 给网站后端。
  5. 后端用 code+secretaccess_token
  6. access_token 获取用户OpenID。

8. OAuth 2.0 安全隐患与防护

攻击类型 防护措施
CSRF攻击 使用 state 参数
Token泄露 HTTPS+短期Token+PKCE
授权码截获 PKCE+限制 redirect_uri
Refresh Token滥用 绑定IP/设备指纹

9. 总结

  • OAuth 2.0 是授权框架,不是认证协议(认证需结合OpenID Connect)。
  • 最安全的模式是授权码+PKCE(Web/App通用)。
  • 永远不要在前端存储 client_secret
  • 实际开发推荐库
    • 后端:passport-oauth2 (Node.js)、Spring Security OAuth2 (Java)
    • 前端:Auth.js (Next.js)、AppAuth (移动端)

OAuth 2.0 已成为互联网授权的基石,理解其原理能帮助你构建更安全的集成方案。

相关推荐
奔跑吧邓邓子3 小时前
【C++实战(74)】深入C++安全编程:密码学实战之旅
c++·安全·实战·密码学·安全编程
galaxylove5 小时前
Gartner发布网络弹性指南:将业务影响评估(BIA)嵌入网络弹性策略的核心,重点保护基础设施和关键业务系统
网络·安全·web安全
是垚不是土6 小时前
Prometheus接入“飞书“实现自动化告警
运维·安全·自动化·github·飞书·prometheus
全栈工程师修炼日记8 小时前
ARMv8系统的安全性(一):安全目标是什么?
安全·trustzone·armv8
爱隐身的官人8 小时前
JAVA代码审计总结
java·网络·安全
lingggggaaaa12 小时前
小迪安全v2023学习笔记(九十七天)—— 云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
java·笔记·学习·安全·网络安全·云原生·kubernetes
byte轻骑兵14 小时前
Windows 安全分割利器:strtok_s () 详解
c语言·开发语言·windows·安全
大数据检索中心14 小时前
监管视角下的大数据信用报告:合规、透明与安全的博弈
大数据·安全
余防15 小时前
代码审计
安全·web安全·网络安全
通信瓦工16 小时前
IEC 61558-2-4-2021一般用途的隔离变压器以及包含隔离变压器的电源装置的安全要求标准介绍
安全·标准下载·标准翻译