🏠 首页 攻略 OAuth 2.0是什么?让第三方应用安全访问你账号的授权协议

OAuth 2.0是什么?让第三方应用安全访问你账号的授权协议

微信登录、GitHub授权……OAuth 2.0是互联网最隐形的安全基石。本文用大白话讲清楚它的原理和使用方式。

你有没有遇到过这种情况:想用 A 应用看看你的微信朋友圈,结果 A 应用直接问你要微信密码?这画面细思极恐——你的密码不就白送出去了吗?

好在互联网有个协议叫 OAuth 2.0,完美解决了这个问题。下次再看到「用微信登录」的按钮,你就知道背后是它在干活。

OAuth 2.0 是什么?

OAuth 2.0 是一个授权协议,不是认证协议。这句话很多人搞混。

认证(Authentication)回答的是「你是谁?」—— 比如你输入密码登录。 授权(Authorization)回答的是「你能做什么?」—— 比如让一个 App 只能读你的朋友圈,不能删。

用个生活中的例子:

你把家门钥匙交给朋友 A,他可以直接进出你家。 你用 OAuth 的方式,是给朋友一个临时门卡——只能进客厅、只能用厕所、明天自动失效。 朋友走后,你还可以随时这张门卡作废。

OAuth 2.0 的核心思想就一句话:不分享密码,只授予有限的、有时效的权限

OAuth 2.0 长什么样?

你可能早就用过它了。看看这几个场景:

场景用的什么协议
用微信登录某个 AppOAuth 2.0
用 GitHub 账号登录 StackOverflowOAuth 2.0
小红书绑定微博同步发布OAuth 2.0
Gmail 让 Google 日历读取邮件OAuth 2.0

每次你看到「授权」按钮,点一下,背后就是 OAuth 2.0 在跑。

OAuth 2.0 的 4 个角色

理解 OAuth 2.0,先记住 4 个角色:

  1. 资源所有者(你)—— 拥有数据的人
  2. 资源服务器(比如微信)—— 存着数据的服务器
  3. 客户端(你要用的 App)—— 想获取你数据的应用
  4. 授权服务器(微信的授权服务)—— 决定给不给权限的服务

核心流程:4 步搞定授权

以最常用的 授权码模式(Authorization Code) 为例:

第 1 步:你在 App 上点「用微信登录」。App 把你的浏览器跳转到微信的授权页面,带上自己的 ID。

第 2 步:你在微信页面登录并点「授权」。微信会问:「是否允许 XX App 读取你的头像和昵称?」你点个确定。

第 3 步:微信把浏览器重定向回 App,附带一个授权码(Authorization Code)。这个码只能用一次,5 分钟过期。

第 4 步:App 拿着授权码,在自己的服务端(不是浏览器!)去找微信的授权服务器换 Access Token。微信核对授权码后,返回一个令牌。

第 5 步:App 用这个令牌调用微信的 API,获取你的头像和昵称。

关键点:Access Token 只在 App 服务端传递,浏览器拿不到。密码更是从未离开过微信。

几种授权模式怎么选?

OAuth 2.0 规定了 4 种授权模式,适合不同场景:

授权码模式(Authorization Code)

适用:后端有服务器的 Web 应用、移动应用 特点:最安全,令牌不经过浏览器 使用场景:微信登录、GitHub 登录

隐式模式(Implicit)

适用:纯前端单页应用(SPA) 特点:令牌直接在浏览器拿到,安全性一般 使用场景:老版 Google 登录、一些轻量级前端应用

密码模式(Resource Owner Password Credentials)

适用:自家第一方应用 特点:直接把用户名密码给客户端,不推荐 使用场景:你自己开发的 App 登录你自己的 API

客户端凭证模式(Client Credentials)

适用:机器对机器通信 特点:不涉及用户,只有两个服务器之间互信 使用场景:微服务之间调用、后端定时任务

一句话选型:有用户参与选授权码模式,机器对机器选客户端凭证模式,其他情况优先考虑授权码模式。

Access Token 和 Refresh Token 的区别

OAuth 2.0 用了两套令牌,各司其职:

  • Access Token:有效期短(通常 1-2 小时),用于请求受保护的资源。就像超市的临时停车券,过期就作废。
  • Refresh Token:有效期长(几天到几个月),用于换取新的 Access Token。就像续停车券的卡,不用重新登录。

这种设计保证了即使 Access Token 泄露,影响范围也很有限——最多 2 小时。

安全注意事项

用 OAuth 2.0 时,有几个常见坑:

1. 授权码只能使用一次

拿到授权码后必须立刻去换 Token。如果攻击者截获了授权码,他可以用一次后就失效了。

2. 一定用 HTTPS

授权码和 Token 在传输过程中必须加密。没有 HTTPS 的 OAuth 等同于裸奔。

3. Redirect URI 要严格校验

客户端注册时,必须指定合法的回调地址。如果服务端不校验,攻击者可以把自己的地址注册为 Redirect URI,骗走授权码。

4. 不要在前端暴露 Client Secret

授权码模式中,Client Secret 只能在后端服务端使用。放在前端 JS 里,谁都能拿到。

总结

OAuth 2.0 不是什么高深的技术,它的核心哲学很简单:信任但要验证,授权但要有限

你不需要手动去实现 OAuth,几乎所有主流平台都提供了现成的 SDK。但你得知道它在干什么——否则哪天你的应用出了安全问题,你连从哪儿排查都不知道。

下次看到「授权」按钮,不妨多想一秒。那个按钮背后,可能正跑着一套你每天都在用、却很少注意的协议。