OAuth2.0 是怎么跑起来的
你有没有遇到过这种情况:第一次用某个 App,点一下“微信登录”就进去了,连账号密码都不用输。背后干活的,大概率就是 OAuth2.0。它不是让你登录,而是帮你授权——让第三方应用在你不给密码的前提下,拿到你在另一个平台的部分权限。
四个角色先认全
整个流程里有四个关键角色:
- 资源所有者:就是你,用户本人
- 客户端(Client):你想登录的那个 App 或网站
- 授权服务器(Authorization Server):比如微信、Google 的认证系统
- 资源服务器(Resource Server):存你数据的地方,比如微信的用户信息接口
最常见的授权码模式流程
现在大多数 Web 应用都用“授权码模式”(Authorization Code Flow),流程是这样的:
- 你在客户端点击“用微信登录”
- 页面跳转到微信的授权页:
https://open.weixin.qq.com/connect/oauth2/authorize?client_id=你的ID&redirect_uri=回调地址&response_type=code&scope=user_info - 你登录微信并同意授权
- 微信把一个临时的 code 发回到你 App 指定的回调地址:
https://your-app.com/callback?code=abc123 - 你的服务器拿着这个 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,安全性更高。