文章目录1. 前言2. 核心概念速览3. 四种授权模式对比4. 最常用的授权模式授权码模式5. 核心概念详解5.1 Access Token访问令牌5.2 Refresh Token刷新令牌5.3 授权码Authorization Code6. 实战流程代码6.1 步骤 1构建授权 URL前端 JavaScript6.2 步骤 2用授权码换令牌后端 Python6.3 步骤 3携带令牌访问资源后端 Python6.4 步骤 4刷新令牌后端 Python7. 现代 SPA 推荐授权码 PKCE8. 安全注意事项9. 快速选型指南10. 一句话总结参考文献1. 前言OAuth 2.0 是一个授权框架允许第三方应用在用户授权的情况下有限地访问用户在另一服务商上的资源而无需获取用户的密码。2. 核心概念速览角色含义举例资源所有者 (Resource Owner)拥有数据的人你用户客户端 (Client)想访问数据的第三方应用一个想读取你网盘文件的 App授权服务器 (Authorization Server)负责发放令牌微信/Google 的认证中心资源服务器 (Resource Server)存放用户数据的服务微信的网盘 API3. 四种授权模式对比模式英文名称适用场景安全性复杂度授权码模式Authorization Code Grant有后端服务器的 Web 应用⭐⭐⭐⭐⭐高隐式模式已弃用Implicit Grant纯前端 SPA已被 PKCE 取代⭐⭐低密码模式Resource Owner Password Credentials Grant第一方应用官方客户端⭐⭐⭐低客户端凭证模式Client Credentials Grant服务器间调用、无用户参与⭐⭐⭐⭐低4. 最常用的授权模式授权码模式这是最安全、最常用的模式尤其适合有后端服务的 Web 应用。资源服务器授权服务器第三方应用用户资源服务器授权服务器第三方应用用户1. 点击“微信登录”2. 重定向到授权页面3. 展示授权页面4. 同意授权5. 返回授权码 (code)6. 用授权码换令牌 (token)7. 返回访问令牌 (access_token)8. 携带令牌请求数据9. 返回用户数据5. 核心概念详解5.1 Access Token访问令牌格式通常是 JWT 或随机字符串作用客户端携带它去访问资源服务器有效期短如 2 小时5.2 Refresh Token刷新令牌作用当 Access Token 过期时用它换取新的 Access Token有效期长如 30 天5.3 授权码Authorization Code作用通过前端渠道浏览器传递再通过后端渠道服务器换令牌确保令牌不暴露给前端特点一次性使用有效期极短如 5 分钟6. 实战流程代码6.1 步骤 1构建授权 URL前端 JavaScriptconstauthUrlhttps://auth.example.com/authorize? response_typecode client_idYOUR_CLIENT_ID redirect_urihttps://yourapp.com/callback scoperead_user state随机字符串;window.location.hrefauthUrl;6.2 步骤 2用授权码换令牌后端 Pythonimportrequests# 用户同意授权后回调接口会收到 codecoderequest.args.get(code)responserequests.post(https://auth.example.com/token,data{grant_type:authorization_code,code:code,client_id:YOUR_CLIENT_ID,client_secret:YOUR_CLIENT_SECRET,redirect_uri:https://yourapp.com/callback})tokensresponse.json()access_tokentokens[access_token]refresh_tokentokens[refresh_token]6.3 步骤 3携带令牌访问资源后端 Pythonheaders{Authorization:fBearer{access_token}}responserequests.get(https://api.example.com/user,headersheaders)6.4 步骤 4刷新令牌后端 Python# Access Token 过期时responserequests.post(https://auth.example.com/token,data{grant_type:refresh_token,refresh_token:refresh_token,client_id:YOUR_CLIENT_ID,client_secret:YOUR_CLIENT_SECRET})new_tokensresponse.json()new_access_tokennew_tokens[access_token]7. 现代 SPA 推荐授权码 PKCE对于纯前端应用使用PKCEProof Key for Code Exchange增强安全性// 1. 生成 code_verifier 和 code_challengeconstverifiergenerateRandomString(128);constchallengeawaitsha256(verifier);// 2. 构建授权 URL带上 code_challengeconstauthUrlhttps://auth.example.com/authorize? response_typecode client_idYOUR_CLIENT_ID redirect_uriyourapp://callback code_challenge${challenge}code_challenge_methodS256;// 3. 换令牌时带上 verifierfetch(https://auth.example.com/token,{method:POST,body:newURLSearchParams({grant_type:authorization_code,code:code,code_verifier:verifier,// 关键client_id:YOUR_CLIENT_ID})});8. 安全注意事项要点说明永远使用 HTTPS防止令牌在传输中被窃取不要存储 Access Token 在前端除非是纯 SPA但建议用后端代理Client Secret 不能暴露在前端只有授权码模式可以安全使用 Secret限制 Scope权限范围只请求必要的权限遵循最小权限原则验证 redirect_uri防止授权码被劫持到恶意地址使用 state 参数防止 CSRF 攻击9. 快速选型指南你的场景推荐方案有后端服务器的 Web 应用授权码模式纯前端 SPAReact/Vue授权码 PKCE移动 AppiOS/Android授权码 PKCE服务间调用无用户客户端凭证模式第一方官方应用如“使用微信登录”密码模式或 授权码模式10. 一句话总结OAuth 2.0 的核心是用“授权码”换“访问令牌”用“访问令牌”调 API用“刷新令牌”续期。参考文献OAuth 2.0 — OAuth理解OAuth 2.0 - 阮一峰的网络日志