[简易图解]『 OAuth2.0』 『进阶』 授权模式总结
一,到底OAuth是什么?
写在前面的
上一次简单傻瓜式的用图来说明了到底什么是OAuth,没看过的童靴可以点击下面这条链接看一下。
看完这个在来看这篇可能理解起来效果拔群。
【简易图解】『 OAuth2.0』 猴子都能懂的图解
简而言之就是一个程序想借用下你的数据( 想借你微信朋友圈内容看一下啦,想借你微博图片下载一下啦)所产生的一系列问题(比如安全,如何授权等等),OAuth就是关于这些的规范。
- 接下来我想就授权模式做一下总结,还是用图。
- 这次的图可能没有上次这么傻瓜,只要仔细阅读一下,就连我非计算机专业出身的人都能懂的话,一般的猴子们估计也没问题。觉得太长的可以只从图解看起,或者只看授权码模式就好。
- 授权模式主要参考来自 RFC 6749
认证 Authentication VS 授权 Authorization
看授权模式图之前,先区别下这两个概念。
- 认证就是我要输入帐号和密码来证明我是我
- 授权就是并非通过帐号和密码来把我的东西借给其他人
- 这其中的关键就是,是否需要输入帐号密码。记住,OAuth不需要输入帐号和密码,你要做的只是授权。
下面这张图清晰的说明了,认证和授权。
二,授权模式
如果有觉得画质太差的,没办法,上传之后就这样了。。
这里是PPT链接。 - 授权码模式
- 简化模式
- 密码模式
- 客户端模式
- 刷新令牌
1. 授权码模式 Authorization Code
- 授权码模式是最常见常用的模式,我们所熟悉的微博,QQ等都是这种模式。
- 另外也是最繁琐的一种方式,如果弄懂了这个相信接下来的三种类型都会迎刃而解。
- 这种模式和其他最大的区别就在于是否有
授权码这个步骤。1.1 图解












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 图解










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 图解









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 图解






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 图解
第三方已存在令牌码为前提进行更新令牌
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":"{授权范围}" // 如果请求和响应的授权范围不一致就必填
}
三,总结
| 授权模式 | 授权终点 | 令牌终点 |
|---|---|---|
| 授权码模式 | 使用 | 使用 |
| 简化模式 | 使用 | 不使用 |
| 密码模式 | 不使用 | 使用 |
| 客户端模式 | 不使用 | 使用 |
| 刷新令牌 | 不使用 | 使用 |
其实授权终点就是授权请求和响应
令牌终点就是令牌的请求和响应
感谢您的阅读!
本作品采用《CC 协议》,转载必须注明作者和本文链接
⬇︎第一次零基础搭建的个人博客。欢迎批评指正,大力鞭策!❤︎
旺财的个人博客(⌯¤̴̶̷̀ω¤̴̶̷́)✧
January 17th, 2020
本帖由系统于 7年前 自动加精






关于 LearnKu
你好,请问你使用的是什么画图软件?
效果拔群~上次看到这个还是宠物小精灵游戏里哈哈
所以简单粗暴的客户端模式够用了吗?
@dengminfeng
PPT - -
@wanghan
一不小心就说了句日式中文。。
当时的Pocket Monster翻译也就是这样直接翻译过来的。
@youjson 帮您找了一段文字
@chihokyo 谢谢
太长了没看完, 不过第一篇倒是看得很明白.
建议看看这篇文章: 博客:Laravel Passport 学习整理
@lzw123
好的。谢谢您给的建议。
那个主要是一步步都是一个图片可能显得比较长,其实主要是面对不懂的小白的说明。
一上来太专业的总结可能对新人不太友好,第一篇就真的是写给小白看的。
但实际操作上可能第二个比较适合深入学习吧。
如果觉得长,其实只要看看授权码模式就可以了。这样基本涵盖了一些重点。
就冲着博主的图片我也不得不点个赞!画图高手!博文我先收藏了,等我将来能看懂的时候好好看。谢谢博主的分享!
@zhaiduting
谢谢鼓励,已经画粗糙了。感觉细节上能在考究点就好了,不过这也不是出书或者教程,做个简图完全够用了,希望能给您带来帮助。
第一种模式,图上。最右边的认证服务器,应该是资源服务器吧?
@echofree313
谢谢您的悉心提醒,刚才我已经修改了。
确实是资源服务器。
内容做了修改,格式方面可能和前几张画风不太一样。回家用电脑修改格式。
好好好好好
博主很用心画这么多图,赞
哈哈。小姐姐,你更新文字就知道更新收款码。之前给你提示过图错了。你只改了授权码模式的图。其他图的最右边的认证服务器应该是资源服务器的(绿色的那个框框)。
@echofree313 我以为你说前几个呢
刚才我一看,我擦,全部都有!
晚上统一搞一下吧。今晚不搞,我给你打赏!
@echofree313
貌似已经全部修改完毕!谢谢反馈!
简单明了。
OAuth ==> Open Authorization
开放授权
博主有心了,讲晦涩的知识讲的通俗易懂,也就是我们上学时候遇见的好老师.
非常赞的好图文教程,我又学到了新东西。
那自省终点?谢谢
这个授权一般应用与APP吧,除了APP貌似想不到还有其他地方可以用到!!
感谢分享。