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

一,到底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
    file
    file
    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":"{授权范围}"                    // 如果请求和响应的授权范围不一致就必填
}

三,总结

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

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

感谢您的阅读!

致力于把博士生的内容说给小学生听

本帖由系统于 2个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 23

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

2个月前
wanghan

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

2个月前

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

2个月前
chihokyo

@dengminfeng
PPT - -

2个月前
chihokyo

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

2个月前
chihokyo

@youjson 帮您找了一段文字

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

2个月前
hedeqiang

file

2个月前

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

2个月前
chihokyo

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

2个月前

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

2个月前
chihokyo

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

2个月前

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

2个月前
chihokyo

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

2个月前
HI

好好好好好

2个月前

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

2个月前

哈哈。小姐姐,你更新文字就知道更新收款码。之前给你提示过图错了。你只改了授权码模式的图。其他图的最右边的认证服务器应该是资源服务器的(绿色的那个框框)。

1个月前
chihokyo

@echofree313 我以为你说前几个呢
刚才我一看,我擦,全部都有!
晚上统一搞一下吧。今晚不搞,我给你打赏!

1个月前
chihokyo

@echofree313
貌似已经全部修改完毕!谢谢反馈!

1个月前

简单明了。

1个月前

OAuth ==> Open Authorization
开放授权

1个月前

博主有心了,讲晦涩的知识讲的通俗易懂,也就是我们上学时候遇见的好老师.

3周前

非常赞的好图文教程,我又学到了新东西。

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

那自省终点?谢谢

1周前

  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
评论须知