OAuth2的授权码许可是最常用的一种交互方式
简单来说, 因为它最安全, 而且有浏览器(webview)就能用
1. 授权码许可获取流程图
我们看一下流程图
2.1 第一步
Client 构造了个AuthServer的链接 给用户, 用户302跳转这个链接, 参数中包含了scope等信息
GET authserver.com/oauth/authorize?grant_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read HTTP/1.1
Host: authserver.com
- https://authserver.com/oauth/authorize : 是oauth服务的api地址
- CLIENT_ID : 是Client在AuthServer提前登记的一个id, 用来给AuthServer判断是哪个第三方应用在申请权限
- redirect_uri : 当授权完成之后, 用户AuthServer会302到这个地址上, 一般是Client的页面地址
- grant_type: 标识该oauth请求是授权码模式
- scope : 标识请求资源内容
2.2 第二步
User 通过浏览器访问该链接, 经过登录之后, Auth Server会在这个页面上问用户, 是否授权, 然后用户提供授权
- 一般是个这种页面, 如果没有登录则会让你先登录, 登录后会让你确认是否授权, QQ这个页面是把登录和授权合并在一个页面上了
2.3 第三步
当用户在第二步授权完成之后, AuthServer会302跳转到 第一步构造的链接的redirect_uri
上并会带上一个code
参数
- `code```就是用户授权的凭证!!
HTTP/1.1 302 Found
Location: https:/CALLBACK_URL?code=AUTHORIZATION_CODE&state=xyz
这个AUTHORIZATION_CODE
就是证明用户已经授权过的一个字符串
当用户跳转到这个地址的时候, Client 就能记录下这个 AUTHORIZATION_CODE
2.4 第四步
此时Client第三方应用, 已经有合法的 AUTHORIZATION_CODE
然后访问AuthServer, 通过 AUTHORIZATION_CODE
向AuthServer请求 ACCESS_TOKEN
POST /oauth/token HTTP/1.1
Host: authserver.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
这两个值不一定要有,看AuthServer怎么实现
- client_id
- client_secret
2.5 第五步
AuthService在之前第二步的时候, 就已经收集了以下信息
AUTHORIZATION_CODE
CLIENT_ID
- 用户信息
SCOPE
这时AuthServer就可以根据你传来的参数, 来对你的请求合法性进行校验
当校验通过的时候, AuthServer 会向Client返回 ACCESS_TOKEN
返回值示例:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
2.6 第六步
现在Client已经有了ACCESS_TOKEN, 带着ACCESS_TOKEN就可以访问用户授权的资源了
https://datatracker.ietf.org/doc/html/rfc6750 bearer token到底是什么? - 布尔什维克冷眼的回答 - 知乎 https://www.zhihu.com/question/305585277/answer/1737224452
Client 选择其中一种方式进行请求(当然前提是资源服务支持)
请求头方式: https://datatracker.ietf.org/doc/html/rfc6750#section-2.1
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
表单请求体方式: https://datatracker.ietf.org/doc/html/rfc6750#section-2.2 ```http POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded
access_token=mF_9.B5f-4.1JqM
- 请求参数方式: [https://datatracker.ietf.org/doc/html/rfc6750#section-2.3](https://datatracker.ietf.org/doc/html/rfc6750#section-2.3)
```http
GET /resource?access_token=mF_9.B5f-4.1JqM HTTP/1.1
Host: server.example.com
3. 示例
获取
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
[