【简易图解】『 OAuth2.0』 『进阶』 授权模式总结
62

一,到底OAuth是什么?

写在前面的

上一次简单傻瓜式的用图来说明了到底什么是OAuth,没看过的童靴可以点击下面这条链接看一下。
看完这个在来看这篇可能理解起来效果拔群。
【简易图解】『 OAuth2.0』 猴子都能懂的图解
简而言之就是一个程序想借用下你的数据( 想借你微信朋友圈内容看一下啦,想借你微博图片下载一下啦)所产生的一系列问题(比如安全,如何授权等等),OAuth就是关于这些的规范。

  • 接下来我想就授权模式做一下总结,还是用图。
  • 这次的图可能没有上次这么傻瓜,只要仔细阅读一下,就连我非计算机专业出身的人都能懂的话,一般的猴子们估计也没问题。觉得太长的可以只从图解看起,或者只看授权码模式就好。
  • 授权模式主要参考来自 RFC 6749

认证 Authentication VS 授权 Authorization

看授权模式图之前,先区别下这两个概念。

  • 认证就是我要输入帐号和密码来证明我是我
  • 授权就是并非通过帐号和密码来把我的东西借给其他人
  • 这其中的关键就是,是否需要输入帐号密码。记住,OAuth不需要输入帐号和密码,你要做的只是授权。
    下面这张图清晰的说明了,认证和授权。
    file

    二,授权模式

    如果有觉得画质太差的,没办法,上传之后就这样了。。
    这里是PPT链接。

  • 授权码模式
  • 简化模式
  • 密码模式
  • 客户端模式
  • 刷新令牌

1. 授权码模式 Authorization Code

  • 授权码模式是最常见常用的模式,我们所熟悉的微博,QQ等都是这种模式。
  • 另外也是最繁琐的一种方式,如果弄懂了这个相信接下来的三种类型都会迎刃而解。
  • 这种模式和其他最大的区别就在于是否有授权码这个步骤。

    1.1 图解

    file
    file
    file
    file
    file
    file
    file
    filefile
    file
    file
    file

1.2 授权请求 Authorization Request

GET {认证终点}
  ?response_type=code           // 必选项
  &client_id={客户端的ID}       // 必选项 
  &redirect_uri={重定向URI}    // 可选项 
  &scope={申请的权限范围}        // 可选项
  &state={任意值}              // 推荐
  HTTP/1.1
HOST: {认证服务器}

1.3 授权响应 Authorization Response

HTTP/1.1 302 Found
Location: {重定向URI}
?code={授权码}          // 必填
&state={任意文字}       // 如果授权请求中包含 state的话那就是必填

1.4 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code      // 必填
&code={授权码}                     // 必填 必须是认证服务器响应给的授权码
&redirect_uri={重定向URI}          // 如果授权请求中包含 redirect_uri 那就是必填
&code_verifier={验证码}            // 如果授权请求中包含 code_challenge 那就是必填

根据具体情况有可能是向客户端服务器进行请求,这时候请加上Basic 认证(Authorization 头部)或者是 参数 client_id & client_secret

1.5 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",      // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},        // 任意
  "refresh_token":"{刷新令牌}",   // 任意
  "scope":"{授权范围}"            // 如果请求和响应的授权范围不一致就必填
}

2. 简化模式 Implicit

  • 简化模式,顾名思义,就是简化了的模式。
  • 简化的就是授权码这个步骤。

    2.1 图解

    file
    file
    file
    file
    file
    file
    file
    file
    file
    file

    2.2 授权请求 Authorization Request

GET {授权终点}
  ?response_type=token             // 必填
  &client_id={客户端ID}      // 必填
  &redirect_uri={重定向URI}  // 可选。授权成功后的重定向地址
  &scope={授权范围}              // 任意
  &state={任意文字}              // 推荐
  HTTP/1.1
HOST: {认证服务器}

2.3 授权响应 Authorization Response

HTTP/1.1 302 Found
Location: {重定向URI}
  #access_token={令牌码}       // 必填
  &token_type={令牌类型}     // 必填
  &expires_in={过期时间}       // 任意
  &state={任意文字}            // 如果授权请求中包含 state 那就是必填
  &scope={授权范围}            // 如果请求和响应的授权范围不一致就必填

3. 密码模式 Resource Owner Password Credentials

  • 密码模式其实就是进一步再去简化了简化模式。
  • 不仅仅没有了授权码模式下的授权码,也没了简化模式下的授权请求。
  • 直接就请求了令牌码。

    3.1 图解

    file
    file
    file
    file
    file
    file
    file
    file
    file

3.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=password       // 必填
&username={用户ID}    // 必填
&password={密码}    // 必填
&scope={授权范围}       // 任意

根据具体情况有可能是向客户端服务器进行请求,这时候请加上Basic 认证(Authorization 头部)或者是 参数 client_id & client_secret

3.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",   // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},        // 任意
  "refresh_token":"{刷新令牌}", // 任意
  "scope":"{授权范围}"              // 如果请求和响应的授权范围不一致就必填
}

4. 客户端模式 Client Credentials

  • 客户端模式可是最简化的了。
  • 什么都不问,直接请求!简单粗暴给我令牌!

    4.1 图解

    file
    file
    file
    file
    file
    file

4.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Authorization: Basic {客户端模式}
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials     // 必填
&scope={授权范围}               // 任意

4.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",  // 必填
  "token_type":"{令牌类型}",      // 必填
  "expires_in":{过期时间},              // 任意
  "scope":"{授权范围}"                // 如果请求和响应的授权范围不一致就必填
}

5. 刷新令牌 Refresh Token

5.1 图解

第三方已存在令牌码为前提进行更新令牌

file
file
file
file
file
file

5.2 令牌请求 Access Token Request

POST {令牌终点} HTTP/1.1
Host: {认证服务器}
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token           // 必填
&refresh_token={刷新令牌}        // 必填
&scope={授权范围}                    // 任意

根据具体情况有可能是向客户端服务器进行请求,这时候请加上Basic 认证(Authorization 头)或者是 参数 client_id & client_secret

5.3 令牌响应 Access Token Response

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"{访问令牌}",      // 必填
  "token_type":"{令牌类型}",          // 必填
  "expires_in":{过期时间},                  // 任意
  "refresh_token":"{刷新令牌}", // 任意
  "scope":"{授权范围}"                    // 如果请求和响应的授权范围不一致就必填
}

三,总结

授权模式 授权终点 令牌终点
授权码模式 使用 使用
简化模式 使用 不使用
密码模式 不使用 使用
客户端模式 不使用 使用
刷新令牌 不使用 使用

其实授权终点就是授权请求和响应
令牌终点就是令牌的请求和响应

感谢您的阅读!

あきらめたらそこで試合終了ですよ・・・?
一旦放弃比赛就结束了。

本帖由系统于 3周前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 16

你好,请问你使用的是什么画图软件?

3周前
wanghan

效果拔群~上次看到这个还是宠物小精灵游戏里哈哈

3周前

所以简单粗暴的客户端模式够用了吗?

3周前
chihokyo

@dengminfeng
PPT - -

3周前
chihokyo

@wanghan
一不小心就说了句日式中文。。
当时的Pocket Monster翻译也就是这样直接翻译过来的。

3周前
chihokyo

@youjson 帮您找了一段文字

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

3周前
hedeqiang

file

3周前

太长了没看完, 不过第一篇倒是看得很明白.
建议看看这篇文章: https://laravel-china.org/articles/6404/laravel-passport-learning-finishing

3周前
chihokyo

@lzw123
好的。谢谢您给的建议。
那个主要是一步步都是一个图片可能显得比较长,其实主要是面对不懂的小白的说明。
一上来太专业的总结可能对新人不太友好,第一篇就真的是写给小白看的。
但实际操作上可能第二个比较适合深入学习吧。
如果觉得长,其实只要看看授权码模式就可以了。这样基本涵盖了一些重点。

3周前

就冲着博主的图片我也不得不点个赞!画图高手!博文我先收藏了,等我将来能看懂的时候好好看。谢谢博主的分享!

3周前
chihokyo

@zhaiduting
谢谢鼓励,已经画粗糙了。感觉细节上能在考究点就好了,不过这也不是出书或者教程,做个简图完全够用了,希望能给您带来帮助。

3周前

第一种模式,图上。最右边的认证服务器,应该是资源服务器吧?

3周前
chihokyo

@echofree313
谢谢您的悉心提醒,刚才我已经修改了。
确实是资源服务器。
内容做了修改,格式方面可能和前几张画风不太一样。回家用电脑修改格式。

3周前
HI

好好好好好

4天前

博主很用心画这么多图,赞

22小时前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!