不止一叶代码屋 个人技术博客 · 代码与生活的记录

后端开发

OAuth 2.0 的几种授权模式,一次讲明白

先说结论

  • 授权码模式:唯一推荐给用户场景的
  • PKCE:手机 App 和 SPA 必须加
  • 隐式模式:废弃了,别用
  • 密码模式:废弃了,别用
  • 客户端凭证:服务端对服务端,仍可用

授权码模式流程

  1. 用户被重定向到授权服务器
  2. 用户登录并同意
  3. 授权服务器回调你的站点,带一个 code
  4. 你在后台用 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,就没有那么多事。

订阅 RSS

← 返回首页