多迈知识库
第二套高阶模板 · 更大气的阅读体验

OAuth2.0 实现流程详解

发布时间:2025-12-09 08:01:04 阅读:10 次

OAuth2.0 是怎么跑起来的

你有没有遇到过这种情况:第一次用某个 App,点一下“微信登录”就进去了,连账号密码都不用输。背后干活的,大概率就是 OAuth2.0。它不是让你登录,而是帮你授权——让第三方应用在你不给密码的前提下,拿到你在另一个平台的部分权限。

四个角色先认全

整个流程里有四个关键角色:

  • 资源所有者:就是你,用户本人
  • 客户端(Client):你想登录的那个 App 或网站
  • 授权服务器(Authorization Server):比如微信、Google 的认证系统
  • 资源服务器(Resource Server):存你数据的地方,比如微信的用户信息接口

最常见的授权码模式流程

现在大多数 Web 应用都用“授权码模式”(Authorization Code Flow),流程是这样的:

  1. 你在客户端点击“用微信登录”
  2. 页面跳转到微信的授权页:https://open.weixin.qq.com/connect/oauth2/authorize?client_id=你的ID&redirect_uri=回调地址&response_type=code&scope=user_info
  3. 你登录微信并同意授权
  4. 微信把一个临时的 code 发回到你 App 指定的回调地址:https://your-app.com/callback?code=abc123
  5. 你的服务器拿着这个 code,加上自己的 client_secret,悄悄去微信服务器换 token
POST /sns/oauth2/access_token HTTP/1.1
Host: api.weixin.qq.com
Content-Type: application/x-www-form-urlencoded

appid=你的appid&secret=你的密钥&code=abc123&grant_type=authorization_code

微信验证通过后返回:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "user_info"
}

拿到 token 后能干啥

有了 access_token,你的服务器就可以代表用户去请求资源了。比如获取用户昵称头像:

GET /sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID HTTP/1.1
Host: api.weixin.qq.com

微信返回用户的基本信息,你的 App 就能完成登录或资料填充了。

为什么不能直接返回 token

有人问,跳转时为啥不直接把 token 塞 URL 里?因为那样太危险。浏览器地址栏、服务器日志都可能记录 URL,容易泄露 token。而 code 只是一次性的中转凭证,就算被截获,没有 client_secret 也换不到 token,安全得多。

刷新机制也不能少

access_token 通常几小时就过期。这时候可以用返回里的 refresh_token 去申请新 token,避免用户频繁重新授权。

POST /sns/oauth2/refresh_token HTTP/1.1
Host: api.weixin.qq.com
Content-Type: application/x-www-form-urlencoded

appid=你的appid&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

实际开发注意点

别忘了加 state 参数防 CSRF。生成一个随机字符串,在跳转前存在 session 里,回调时校验是否一致。这样能防止别人伪造授权请求。

另外,client_secret 必须藏好,别放在前端代码里。换 token 这种操作一定要在服务端完成。

现在很多平台还支持 PKCE 扩展,特别适合移动端和单页应用,用来替代 client_secret,安全性更高。