调试 OAuth 2.0 鉴权接口
什么是 OAuth 2.0?
OAuth 2.0 是一种授权框架,允许用户授权第三方应用程序(例如通过支付宝、微信、QQ 账号)代表他们访问或注册服务。用户不再需要重复地手动输入自己的各项信息才能完成网页注册,使用第三方鉴权登录还能够确保个人数据的安全性和灵活性。
这种授权框架已被广泛应用于许多互联网服务中,如社交媒体平台、API 提供商和第三方应用程序集成。
鉴权流程图如下:
快速上手
现在假设你搭建了 1 个网站,而这个网站允许用户使用微信扫码登录。那么,你的网站就是客户端。而微信就是认证服务器和资源服务器。要想接入 OAuth 2.0,具体需要经过哪些步骤呢?本文将上面流程图的每一个步骤进行说明。
1. 网页请求用户给予授权
用户点击网站上的「微信登录」按钮后,将会被导向至由微信官方提供的扫码登录页面。通过分析域名可以得知,浏览器此时实际访问的是微信认证服务器。
认证页面的 URL 为:https://open.weixin.qq.com/connect/qrconnect
。根据微信官方文档说明,调用此端口需要携带的 Query 参数是:
参数名 | 参数值 |
---|---|
appid | 你的网站在微信开放平台申请到的应用唯一标识 |
redirect_uri | 用户确认授权后,重定向到你的网站中的一个页面,接收微信返回的 code 值 |
response_type | 固定值,code |
scope | 固定值,snsapi_login |
state | 随机数 |
2. 用户同意网页授权请求
用户使用微信扫码后,手动同意并给予客户端(网站)微信账号授权,允许客户端(网站)获取用户在资源服务器(微信)的昵称、头像等个人信息。
3. 网页向微信申请令牌
用户同意授权之后,浏览器会从扫码登录界面自动重定向到 redirect_uri
,其中的 Query 参数携带了 code
和 state
字段。
参数名 | 参数值 |
---|---|
code | 微信返回的随机数 |
state | 在第 1 步中通过 state 字段传给微信的随机数,原样返回 |
redirect_uri
由你架设的网站所提供,因此可以获取到 code 字段。然后通过服务器调用认证服务(微信)的 API 接口以申请令牌。API 的地址是 https://api.weixin.qq.com/sns/oauth2/access_token
,需要携带以下 Query 参数:
参数名 | 参数值 |
---|---|
appid | 你的网站在微信开放平台申请到的应用唯一标识 |
secret | 你的网站在微信开放平台申请到的应用密钥 |
code | 微信返回的 code 的值 |
grant_type | 固定值,authorization_code |
在调试的过程中,可以使用 Apifox 来调用认证服务器(微信)的 API 接口申请令牌。新建”快捷请求“后,参考下图填写各项参数后发送请求。
4. 微信授权网页请求
调用认证服务器(微信)的 API 接口后,微信会校验相关信息是否有效。认证通过后,微信向客户端(网页)发放授权令牌,含在 API 接口返回的 JSON 中。
字段名 | 字段值 |
---|---|
access_token | 接口调用凭证,即令牌 |
expires_in | 令牌的有效期 |
refresh_token | 用于刷新令牌的凭证,即刷新令牌 |
openid | 授权用户的唯一标识 |
scope | 用户授权的作用域 |
数据返回格式可参考下图。
5. 网页获取资源微信中的用户信息
获取授权令牌之后,网页就可以微信申请获取用户信息资源(头像和昵称)了。微信资源的 API 的地址是 https://api.weixin.qq.com/sns/userinfo
,需要传递以下 Query 参数:
字段名 | 字段值 |
---|---|
access_token | 接口调用凭证,即令牌 |
openid | 授权用户的唯一标识 |
通过前面步骤所获取到的令牌,使用 Apifox 请求微信资源(头像和昵称)的 API 地址。
6. 微信确认令牌并向网页返回用户信息
资源服务器(微信)检查令牌无误后,向客户端(网页)开放资源,即返回用户的昵称、头像等信息。
可以看出,用户的昵称在 API 返回的 JSON 的 nickname 字段,而用户的头像地址在 headimgurl 字段。现在有了这些信息后,用户无需繁琐的账号密码注册也能够完成网页注册,网站上也可以直接展示用户的微信头像和昵称。
总结
调试 OAuth 2.0 接口大致需要六步,使用 Apifox 调试接口能够帮助你更加清晰地看到上下游所需要传递的各项参数,优化调试体验。使用 Apifox 将完整链路跑通后,后端就可以开始编写代码来完成整个业务过程,而不必边开发边验证。