OAuth 2.0 的几种授权模式,一次讲明白
先说结论
- 授权码模式:唯一推荐给用户场景的
- PKCE:手机 App 和 SPA 必须加
- 隐式模式:废弃了,别用
- 密码模式:废弃了,别用
- 客户端凭证:服务端对服务端,仍可用
授权码模式流程
- 用户被重定向到授权服务器
- 用户登录并同意
- 授权服务器回调你的站点,带一个
code - 你在后台用
code换token
第 4 步是关键:token 直接在浏览器里拿,会被前端代码和中间人看到。
为什么要 PKCE
SPA 没有后端,没法安全保存 client_secret。PKCE 用一个临时的 code_verifier 代替,流程变成:
code_challenge = BASE64URL(SHA256(code_verifier))
请求授权时发 challenge,换 token 时发 verifier,授权服务器比对。这样即使 code 被截获,没有 verifier 也换不到 token。
state 参数别忘
?response_type=code&state=<随机值>
回调时比对 state,可以防 CSRF。少了这一步,你的回调接口就是个开放的重定向漏洞。
常见错误
- 把 token 存 localStorage(XSS 一偷一个准)
redirect_uri没做白名单(变成开放重定向)- 用隐式模式还觉得挺方便
小结
OAuth 的坑几乎都集中在「图省事」上。老老实实用授权码 + PKCE,就没有那么多事。