https://datatracker.ietf.org/doc/html/rfc6749#section-4.1

OAuth2的授权码许可是最常用的一种交互方式
简单来说, 因为它最安全, 而且有浏览器(webview)就能用

1. 授权码许可获取流程图

我们看一下流程图

  1. https://datatracker.ietf.org/doc/html/rfc6749#section-4.1

image.png

  1. https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2#grant-type-authorization-code

image.png

  • 这两张图其实是一样的东西, 多看几张找共性可以加深理解
  • 途中没有出现 Resource Server ,其实也没必要出现

    2. 交互流程简介

    假设现在Client希望获取资源

2.1 第一步

https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1

Client 构造了个AuthServer的链接 给用户, 用户302跳转这个链接, 参数中包含了scope等信息

  1. GET authserver.com/oauth/authorize?grant_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read HTTP/1.1
  2. 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这个页面是把登录和授权合并在一个页面上了

image.png

2.3 第三步

当用户在第二步授权完成之后, AuthServer会302跳转到 第一步构造的链接的redirect_uri上并会带上一个code参数

  • `code```就是用户授权的凭证!!
    1. HTTP/1.1 302 Found
    2. 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

  1. POST /oauth/token HTTP/1.1
  2. Host: authserver.com
  3. Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
  4. Content-Type: application/x-www-form-urlencoded
  5. 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 第五步

https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.3

AuthService在之前第二步的时候, 就已经收集了以下信息

  • AUTHORIZATION_CODE
  • CLIENT_ID
  • 用户信息
  • SCOPE

这时AuthServer就可以根据你传来的参数, 来对你的请求合法性进行校验
当校验通过的时候, AuthServer 会向Client返回 ACCESS_TOKEN

返回值示例:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. Cache-Control: no-store
  4. Pragma: no-cache
  5. {
  6. "access_token":"2YotnFZFEjr1zCsicMWpAA",
  7. "token_type":"example",
  8. "expires_in":3600,
  9. "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  10. "example_parameter":"example_value"
  11. }

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 选择其中一种方式进行请求(当然前提是资源服务支持)

access_token=mF_9.B5f-4.1JqM

  1. - 请求参数方式: [https://datatracker.ietf.org/doc/html/rfc6750#section-2.3](https://datatracker.ietf.org/doc/html/rfc6750#section-2.3)
  2. ```http
  3. GET /resource?access_token=mF_9.B5f-4.1JqM HTTP/1.1
  4. Host: server.example.com

3. 示例

获取
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
[

](https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Authorized_Interface_Calling_UnionID.html)