OAuth 2.0 认证流程通俗解释

FreeGuideOnline 最新 2026-07-08

什么是 OAuth 2.0?一个你每天都在用的「授权协议」

你在刷微博时,点击「用微信登录」;你想让某个 App 读取你的 Google 日历,但又不想把 Google 密码告诉它;你在电商网站通过支付宝付款……这些场景背后,都离不开 OAuth 2.0。

OAuth 2.0 是一个授权框架,它让第三方应用可以在你授权的情况下,有限度地访问你在另一个服务上的资源,整个过程不需要你把密码交给第三方。记住这个核心公式:

授权 ≠ 交出密码

打个比方:你住酒店,可以把身份证押在前台换取一张临时房卡,房卡只能进入你的房间、只能在入住期间使用。你不会把家里的钥匙给酒店,也不会告诉服务员你家保险箱的密码。OAuth 2.0 扮演的就是「发行临时房卡」的系统。

认识四个关键角色

在 OAuth 2.0 的世界里,一次授权请求会涉及四个角色:

  • 资源拥有者(Resource Owner):通常就是你——用户本人,你拥有要访问的数据(比如你的微信头像、昵称)。
  • 客户端(Client):想要访问你数据的第三方应用,例如那个写着「用微信登录」的网站。
  • 授权服务器(Authorization Server):负责验证你的身份,并发放「临时房卡」(即令牌)的服务器,比如微信的开放平台登录系统。
  • 资源服务器(Resource Server):存放你数据的服务器,比如微信存储用户资料的服务器。它只认「临时房卡」,不认第三方应用。

剧情重演:最经典的「授权码流程」

授权码模式(Authorization Code)是 OAuth 2.0 中最完整、最安全的流程,也是绝大多数 Web 应用的首选。我们用一个具体场景来拆解:

你想让第三方网站「欢乐农场」读取你的微信昵称和头像,但不想把微信密码交给农场。

第一步:请求授权码

当你点击「用微信登录」时,浏览器会被重定向到微信的授权页面。这个链接里,客户端(欢乐农场)会告诉微信:

  • 我是谁(client_id
  • 我要什么权限(scope,比如只读取用户信息)
  • 成功之后把我带回哪里(redirect_uri

你作为资源拥有者,看到的页面是:「欢乐农场想要获取你的公开资料,是否同意?」。你点了「同意」。这时,微信的授权服务器会生成一个授权码(Authorization Code),并将你重定向回欢乐农场的 redirect_uri,同时在地址栏附带这个一次性、短期有效的授权码。

这个授权码本身并不直接用来读取你的头像,它就像一张兑换券

第二步:用授权码换令牌

欢乐农场收到授权码后,会在后端服务器向微信的授权服务器发起请求,并附上自己的 client_secret(客户端密钥)和刚才得到的授权码。

微信验证一切无误后,发放两个令牌:

  • 访问令牌(Access Token):这是真正的「临时房卡」,欢乐农场可以拿着它去资源服务器请求你的头像和昵称。
  • 刷新令牌(Refresh Token):访问令牌有效期很短(通常几小时),过期后可凭刷新令牌获取新的访问令牌,无需你再次授权。

第三步:用令牌访问资源

欢乐农场现在拿着 Access Token 去微信的资源服务器请求用户信息。资源服务器验证令牌有效、权限匹配,然后返回你的昵称和头像。整个过程你的微信密码从未离开过微信的服务器,欢乐农场只知道一个临时的令牌。

这个三步流程完美体现了「授权码」存在的价值:授权码通过浏览器(前端)传递,但换取令牌的关键步骤是服务器对服务器进行的,client_secret 不会暴露在浏览器端,极大保证了安全。

哪把钥匙开哪把锁:四种授权模式

除了最安全的授权码模式,OAuth 2.0 还定义了另外三种模式,适用于不同场景。

简化模式(Implicit)

  • 流程:直接在前端返回 Access Token,省去授权码换取令牌的步骤。
  • 场景:纯前端应用(如单页面 SPA),没有后端服务保存 client_secret
  • 风险:Access Token 暴露在浏览器历史或 URL 中,容易泄露,现已不推荐使用,被 PKCE 增强的授权码模式替代。

密码模式(Resource Owner Password Credentials)

  • 流程:用户直接把用户名和密码交给客户端,客户端再以此换取令牌。
  • 场景:高度受信任的自有应用,比如官方的手机 App 直接输密码登录。
  • 风险:用户密码会经过客户端,信任成本极高。除非无法避免,否则不该使用。

客户端凭证模式(Client Credentials)

  • 流程:客户端以自己的身份(而非代表用户)去获取令牌。
  • 场景:服务器之间的机器对机器通信,比如后台任务从另一个服务拉取数据,不涉及特定用户。
  • 典型例子:你的后端服务调用微信支付 API,使用的是商户号下的凭证,而非某个用户的授权。

真实世界样板:GitHub OAuth 登录体验

GitHub 是 OAuth 2.0 的绝佳实践者。当你用 GitHub 账号登录编程社区时:

  1. 你在社区点击「Sign in with GitHub」,页面跳到达 GitHub 的授权页。
  2. GitHub 显示:「该应用想要访问你的公开仓库、用户信息,是否授权?」
  3. 你同意后,社区收到一个授权码,并用你提前在 GitHub 注册应用时获取的 Client IDClient Secret 在后端换取 Access Token。
  4. 社区用这个 Token 调用 GitHub API,拿到你的头像、用户名,完成登录。

整个过程你的 GitHub 密码仅与 GitHub 服务器发生交互,社区开发者永远看不到。

别忘了 Refresh Token:长久的体贴

你可能会问:如果 Access Token 过期了,难道每次都要让我重新点「同意」?当然不需要,Refresh Token 就是为了解决这个体验问题。

  • Refresh Token 的有效期很长(可能是一周、一个月),并且一般只会在换取新 Access Token 时使用一次。
  • 客户端在 Access Token 过期后,带着 Refresh Token 去授权服务器静默换取新的 Access Token(有时也会发一个新的 Refresh Token)。
  • 这样用户只要授权一次,就可以长期使用,同时又不会因为 Access Token 长期有效而增加泄露风险。

总结你的 OAuth 2.0 思维地图

概念 比喻 作用
授权码 兑换券 兑换 Access Token 的一次性凭证
Access Token 临时房卡 访问资源的凭证,短有效期
Refresh Token 长期会员卡 换取新的 Access Token,长有效期
Scope 房卡限制区域 定义第三方可以访问哪些资源
Client ID/Secret 商家营业执照 证明第三方应用的身份

现在,当你在任何地方看到「使用 xx 账号登录」时,应该能瞬间明白:一次安全、标准的 OAuth 2.0 授权正在后端悄然运行,它既让你的数据能安全交付,又让你摆脱了「到处填密码」的噩梦。