一口气说出 OAuth2.0 的四种授权方式,面试官会高看一眼

本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步

上周我的自研开源项目开始破土动工了,《开源项目迈出第一步,10 选 1?页面模板成了第一个绊脚石
》 ,密谋很久才付诸行动,做这个的初衷就是不想让自己太安稳,技术这条路不进步就等于后退,必须要逼着自己学习。

项目偏向于技术实践,因此不会做太多的业务堆砌,业务代码还是在公司学习比较好。现在正在做技术的选型与储备,像比较主流的,项目前后端分离微服务SpringbootSpringcloud 等都会应用到项目中,其实很多技术我也不会,也是在反复的查阅资料求证,探索的过程技术提升真的要比工作中快很多,毕竟主动与被动学习是有本质区别的。

这几天打算先把项目的前后端分离架构搭建完成,既然是前后端分离项目就免不了做鉴权, 所以 oauth2.0 是一个我们不得不了解的知识点。


一、OAuth2.0 为何物

OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。

OAuth2.0OAuth 协议的一个版本,有2.0版本那就有1.0版本,有意思的是OAuth2.0 却不向下兼容OAuth1.0 ,相当于废弃了1.0版本。

举个小栗子解释一下什么是 OAuth 授权?

在家肝文章饿了定了一个外卖,外卖小哥30秒火速到达了我家楼下,奈何有门禁进不来,可以输入密码进入,但出于安全的考虑我并不想告诉他密码。

此时外卖小哥看到门禁有一个高级按钮“一键获取授权”,只要我这边同意,他会获取到一个有效期 2小时的令牌(token)正常出入。

在这里插入图片描述

令牌(token)和 密码 的作用虽然相似都可以进入系统,但还有点不同。token 拥有权限范围,有时效性的,到期自动失效,而且无效修改。

二、OAuth2.0 授权方式

OAuth2.0 的授权简单理解其实就是获取令牌(token)的过程,OAuth 协议定义了四种获得令牌的授权方式(authorization grant )如下:

  • 授权码(authorization-code
  • 隐藏式(implicit
  • 密码式(password):
  • 客户端凭证(client credentials

但值得注意的是,不管我们使用哪一种授权方式,在三方应用申请令牌之前,都必须在系统中去申请身份唯一标识:客户端 ID(client ID)和 客户端密钥(client secret)。这样做可以保证 token 不被恶意使用。

下面我们会分析每种授权方式的原理,在进入正题前,先了解 OAuth2.0 授权过程中几个重要的参数:

  • response_type:code 表示要求返回授权码,token 表示直接返回令牌
  • client_id:客户端身份标识
  • client_secret:客户端密钥
  • redirect_uri:重定向地址
  • scope:表示授权的范围,read只读权限,all读写权限
  • grant_type:表示授权的方式,AUTHORIZATION_CODE(授权码)、password(密码)、client_credentials(凭证式)、refresh_token 更新令牌
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

1、授权码

OAuth2.0四种授权中授权码方式是最为复杂,但也是安全系数最高的,比较常用的一种方式。这种方式适用于兼具前后端的Web项目,因为有些项目只有后端或只有前端,并不适用授权码模式。

下图我们以用WX登录掘金为例,详细看一下授权码方式的整体流程。

在这里插入图片描述

用户选择WX登录掘金,掘金会向WX发起授权请求,接下来 WX询问用户是否同意授权(常见的弹窗授权)。response_typecode 要求返回授权码,scope 参数表示本次授权范围为只读权限,redirect_uri 重定向地址。

https://wx.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=http://juejin.im/callback&scope=read

用户同意授权后,WX 根据 redirect_uri重定向并带上授权码。

http://juejin.im/callback?code=AUTHORIZATION_CODE

当掘金拿到授权码(code)时,带授权码和密匙等参数向WX申请令牌。grant_type表示本次授权为授权码方式 authorization_code ,获取令牌要带上客户端密匙 client_secret,和上一步得到的授权码 code

https://wx.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=http://juejin.im/callback

最后 WX 收到请求后向 redirect_uri 地址发送 JSON 数据,其中的access_token 就是令牌。

 {    "access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read",......
}

2、隐藏式

上边提到有一些Web应用是没有后端的, 属于纯前端应用,无法用上边的授权码模式。令牌的申请与存储都需要在前端完成,跳过了授权码这一步。

前端应用直接获取 tokenresponse_type 设置为 token,要求直接返回令牌,跳过授权码,WX授权通过后重定向到指定 redirect_uri

https://wx.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=http://juejin.im/callback&scope=read

3、密码式

密码模式比较好理解,用户在掘金直接输入自己的WX用户名和密码,掘金拿着信息直接去WX申请令牌,请求响应的 JSON结果中返回 tokengrant_typepassword 表示密码式授权。

https://wx.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID

这种授权方式缺点是显而易见的,非常的危险,如果采取此方式授权,该应用一定是可以高度信任的。

4、凭证式

凭证式和密码式很相似,主要适用于那些没有前端的命令行应用,可以用最简单的方式获取令牌,在请求响应的 JSON 结果中返回 token

grant_typeclient_credentials 表示凭证式授权,client_idclient_secret 用来识别身份。

https://wx.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

三、令牌的使用与更新

1、令牌怎么用?

拿到令牌可以调用 WX API 请求数据了,那令牌该怎么用呢?

每个到达WX的请求都必须带上 token,将 token 放在 http 请求头部的一个Authorization字段里。

如果使用postman 模拟请求,要在Authorization -> Bearer Token 放入 token注意:低版本postman 没有这个选项。

在这里插入图片描述

2、令牌过期怎么办?

token是有时效性的,一旦过期就需要重新获取,但是重走一遍授权流程,不仅麻烦而且用户体验也不好,那如何让更新令牌变得优雅一点呢?

一般在颁发令牌时会一次发两个令牌,一个令牌用来请求API,另一个负责更新令牌 refresh_tokengrant_typerefresh_token 请求为更新令牌,参数 refresh_token 是用于更新令牌的令牌。

https://wx.com/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN

总结

OAuth2.0 授权其实并不是很难,只不过授权流程稍显麻烦,逻辑有些绕,OAuth2.0它是面试经常会被问到的知识点,还是应该多了解一下。下一篇实战 OAuth2.0四种授权,敬请期待,欢迎关注哦~


上周我的自研开源项目开始破土动工了,《开源项目迈出第一步,10 选 1?页面模板成了第一个绊脚石
》 ,密谋很久才付诸行动,做这个的初衷就是不想让自己太安稳,技术这条路不进步就等于后退,必须要逼着自己学习。

项目偏向于技术实践,因此不会做太多的业务堆砌,业务代码还是在公司学习比较好。现在正在做技术的选型与储备,像比较主流的,项目前后端分离微服务SpringbootSpringcloud 等都会应用到项目中,其实很多技术我也不会,也是在反复的查阅资料求证,探索的过程技术提升真的要比工作中快很多,毕竟主动与被动学习是有本质区别的。

这几天打算先把项目的前后端分离架构搭建完成,既然是前后端分离项目就免不了做鉴权, 所以 oauth2.0 是一个我们不得不了解的知识点。


一、OAuth2.0 为何物

OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。

OAuth2.0OAuth 协议的一个版本,有2.0版本那就有1.0版本,有意思的是OAuth2.0 却不向下兼容OAuth1.0 ,相当于废弃了1.0版本。

举个小栗子解释一下什么是 OAuth 授权?

在家肝文章饿了定了一个外卖,外卖小哥30秒火速到达了我家楼下,奈何有门禁进不来,可以输入密码进入,但出于安全的考虑我并不想告诉他密码。

此时外卖小哥看到门禁有一个高级按钮“一键获取授权”,只要我这边同意,他会获取到一个有效期 2小时的令牌(token)正常出入。

在这里插入图片描述

令牌(token)和 密码 的作用虽然相似都可以进入系统,但还有点不同。token 拥有权限范围,有时效性的,到期自动失效,而且无效修改。

二、OAuth2.0 授权方式

OAuth2.0 的授权简单理解其实就是获取令牌(token)的过程,OAuth 协议定义了四种获得令牌的授权方式(authorization grant )如下:

  • 授权码(authorization-code
  • 隐藏式(implicit
  • 密码式(password):
  • 客户端凭证(client credentials

但值得注意的是,不管我们使用哪一种授权方式,在三方应用申请令牌之前,都必须在系统中去申请身份唯一标识:客户端 ID(client ID)和 客户端密钥(client secret)。这样做可以保证 token 不被恶意使用。

下面我们会分析每种授权方式的原理,在进入正题前,先了解 OAuth2.0 授权过程中几个重要的参数:

  • response_type:code 表示要求返回授权码,token 表示直接返回令牌
  • client_id:客户端身份标识
  • client_secret:客户端密钥
  • redirect_uri:重定向地址
  • scope:表示授权的范围,read只读权限,all读写权限
  • grant_type:表示授权的方式,AUTHORIZATION_CODE(授权码)、password(密码)、client_credentials(凭证式)、refresh_token 更新令牌
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

1、授权码

OAuth2.0四种授权中授权码方式是最为复杂,但也是安全系数最高的,比较常用的一种方式。这种方式适用于兼具前后端的Web项目,因为有些项目只有后端或只有前端,并不适用授权码模式。

下图我们以用WX登录掘金为例,详细看一下授权码方式的整体流程。

在这里插入图片描述

用户选择WX登录掘金,掘金会向WX发起授权请求,接下来 WX询问用户是否同意授权(常见的弹窗授权)。response_typecode 要求返回授权码,scope 参数表示本次授权范围为只读权限,redirect_uri 重定向地址。

https://wx.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=http://juejin.im/callback&scope=read

用户同意授权后,WX 根据 redirect_uri重定向并带上授权码。

http://juejin.im/callback?code=AUTHORIZATION_CODE

当掘金拿到授权码(code)时,带授权码和密匙等参数向WX申请令牌。grant_type表示本次授权为授权码方式 authorization_code ,获取令牌要带上客户端密匙 client_secret,和上一步得到的授权码 code

https://wx.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=http://juejin.im/callback

最后 WX 收到请求后向 redirect_uri 地址发送 JSON 数据,其中的access_token 就是令牌。

 {    "access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read",......
}

2、隐藏式

上边提到有一些Web应用是没有后端的, 属于纯前端应用,无法用上边的授权码模式。令牌的申请与存储都需要在前端完成,跳过了授权码这一步。

前端应用直接获取 tokenresponse_type 设置为 token,要求直接返回令牌,跳过授权码,WX授权通过后重定向到指定 redirect_uri

https://wx.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=http://juejin.im/callback&scope=read

3、密码式

密码模式比较好理解,用户在掘金直接输入自己的WX用户名和密码,掘金拿着信息直接去WX申请令牌,请求响应的 JSON结果中返回 tokengrant_typepassword 表示密码式授权。

https://wx.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID

这种授权方式缺点是显而易见的,非常的危险,如果采取此方式授权,该应用一定是可以高度信任的。

4、凭证式

凭证式和密码式很相似,主要适用于那些没有前端的命令行应用,可以用最简单的方式获取令牌,在请求响应的 JSON 结果中返回 token

grant_typeclient_credentials 表示凭证式授权,client_idclient_secret 用来识别身份。

https://wx.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

三、令牌的使用与更新

1、令牌怎么用?

拿到令牌可以调用 WX API 请求数据了,那令牌该怎么用呢?

每个到达WX的请求都必须带上 token,将 token 放在 http 请求头部的一个Authorization字段里。

如果使用postman 模拟请求,要在Authorization -> Bearer Token 放入 token注意:低版本postman 没有这个选项。

在这里插入图片描述

2、令牌过期怎么办?

token是有时效性的,一旦过期就需要重新获取,但是重走一遍授权流程,不仅麻烦而且用户体验也不好,那如何让更新令牌变得优雅一点呢?

一般在颁发令牌时会一次发两个令牌,一个令牌用来请求API,另一个负责更新令牌 refresh_tokengrant_typerefresh_token 请求为更新令牌,参数 refresh_token 是用于更新令牌的令牌。

https://wx.com/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN

总结

OAuth2.0 授权其实并不是很难,只不过授权流程稍显麻烦,逻辑有些绕,OAuth2.0它是面试经常会被问到的知识点,还是应该多了解一下。下一篇实战 OAuth2.0四种授权,敬请期待,欢迎关注哦~


原创不易,燃烧秀发输出内容,如果有一丢丢收获,点个赞鼓励一下吧!

整理了几百本各类技术电子书,送给小伙伴们。关注公号回复【666】自行领取。和一些小伙伴们建了一个技术交流群,一起探讨技术、分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧!

巨人的肩膀

https://tools.ietf.org/html/rfc6749#section-1.3.2

https://blog.csdn.net/huenbin/article/details/90719554

https://www.jianshu.com/p/8bb28d879115

http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

https://blog.csdn.net/tclzsn7456/article/details/79550249

http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/65932.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国际植物基博览会将首次亮相上海;伊利刷新中国乳业在东南亚投资纪录 | 食品饮料新品...

伊利、百事、百威亚太、国际植物基博览会、索迪斯等企业最新动态。 新店开业 北京西南华邑酒店“簋”现代融合火锅店即将开业 即将于2021年12月31日新开业的“簋”现代融合火锅餐厅突破传统火锅概念,将中式火锅体验升级至富有当代时尚感的全新高度。这种传统北京人喜…

中国半导体企业IPO激增;英特尔拆分显卡业务部门;特斯拉将开启新一轮裁员丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 01.中国半导体企业IPO激增 中国的芯片公司正处于一波IPO热潮中。截至12月15日的一年,生产芯片或芯片制造设备的公司通过国内IPO筹集了约合120亿美元资金,几乎是2021年的三倍。此外,该行…

雷克萨斯全球首发新纯电车型RZ;中国海油正式登陆A股 | 美通企业日报

美通社要闻摘要: LEXUS雷克萨斯全新纯电车型RZ全球首发。LG和麦格纳合资墨西哥新工厂计划2023年投入使用。Novavax新冠疫苗在日本获批。富士胶片AI技术可预测认知症是否会进展为阿尔茨海默病。此芯科技获顺为领投超亿元天使轮融资。飞利浦磁吸轨道系列全新上市。中国…

SAP License:影响中国信息化全面预算管理八大成功案例

2007年,是中国信息化工作扎实推进的一年,也是全面预算管理由理论走向实践的关键一年,这一年,有许多全面预算管理信息化成功案例渐渐浮出水面,值得我们学习、研究和探讨。全面预算管理信息化是我国信息化内容的重要组成…

麦当劳中国推出新升级巨无霸;斯凯孚大连四期新工厂项目动工 | 美通企业日报...

美通社要闻摘要: 麦当劳中国推出新升级巨无霸。斯凯孚大连四期新工厂项目动工。Volocopter获1.82亿美元E轮融资。保时捷管理咨询与磐拓航空达成战略合作。上海西门子医疗器械有限公司成立三十周年。赛多利斯华北区域客户应用与创新中心全新开幕。Citeline和Norstell…

武汉:“大象转身”,“中国车都”变“中国车谷”的二段跨越

谁都知道,智能汽车是通向未来产业高地的必经之路,无数人为之疯狂。 对于这场有关未来的竞争,我们可以将其一分为二,微观上是市场层面,各个企业公司之间的竞争;宏观上是产业层面,各个城市与地方政…

1000亿美元!英特尔要在美国建世界最大芯片厂,美520 亿美元芯片法案接近敲定...

来源:新智元 编辑:桃子 拉燕 时光 1000亿美元芯片计划,要重振英特尔往日雄风! 路透称,英特尔将投资200亿美元建设2家芯片制造工厂,并计划最终投资多达1000亿美元。 新工厂的建设将于今年晚些时候开始&#…

“后 Hadoop 时代”,大数据从业者如何应对新技术趋势带来的挑战?

作者 | 蔡芳芳 采访嘉宾 | 刘京娟、贾扬清、王峰 作为开源大数据项目的发端,Hadoop 兴起至今已经超过十五年。在过去这十数年里,开源大数据领域飞速发展,我们见证了多元化技术的兴起和变迁。 为了从代码托管平台汇聚的海量数据里,…

星巴克中国咖啡创新产业园正式动工,追加项目总投资至近11亿元

星巴克中国咖啡创新产业园在江苏昆山正式破土动工。这是继今年3月,星巴克宣布启动这项美国之外最大的生产性战略投资后又一突破性进展。开工仪式上,星巴克宣布将继续追加项目总投资至近11亿人民币(1.56亿美元)。产业园的如期建设和…

英特尔CEO宣布1000亿美元芯片投资计划

NEW 关注Tech逆向思维视频号 最新视频→【千里投毒?疫情期间收到国际快递该咋办】 出品|网易智能 1月22日消息,当地时间周五,芯片制造商英特尔表示,初步投资200亿美元建设两家芯片制造工厂;并计划最终或投资…

丹纳赫诊断平台中国研发制造基地在苏州动工,项目投资上亿美元

2021年3月30日,丹纳赫诊断平台中国研发及制造基地在苏州工业园区正式奠基动工。这是继去年7月,丹纳赫宣布启动此项单笔金额最高的本土战略投资后的又一重大进展。 丹纳赫诊断平台中国研发制造基地项目投资金额达上亿美元。项目一期将建成37,000平方米厂房…

中国移动5G智慧港口IGV集卡控制

桥吊远程控制 装卸作业区中主要业务单元是桥吊,桥吊高度 60-70 米,电气房高度 50 米, 需要无线网络实现作业区域网络覆盖。桥吊的通信需求分为远程控制和监控两类, 远程控制场景下单个桥吊同时回传摄像头数量及以 Ik V 2r/ kL : …

借助实例轻松掌握 Makefile -- 萌芽破土

萌芽破土篇 实例1:hello world 编辑 Makefile all:echo "hello world"编译执行 $ make $ make all 结果输出 语法说明 echo 前面必须只有 TAB(即你键盘上的 TAB键),且至少有一个 TAB,不能用空格代替。 实例…

算是2022年上半年中国企业服务产业的一个阶段性总结吧

这篇文章是应一个朋友的问答访谈而遗留整理的 (1)IaaS:云 中国的云计算这个市场,咱们从四个方面来说:技术、资本、竞合、生态。 一、技术 1、私有云、公有专属云、公有云,百花齐放。尤其现在还有行业云&…

介绍中国传统节日的网页html,介绍中国传统节日的作文4篇

介绍中国传统节日的作文如何写?中国传统节日丰富多彩,让我们的传统节日永远继承下去,让我们的传统文化光辉灿烂。本文是小编为大家整理的介绍中国传统节日的作文4篇_中华传统节日作文大全,欢迎阅读。 更多关于中国传统节日作文内容…

通用人工智能综述 从背景介绍到API调用

通用人工智能综述 通用人工智能综述背景介绍模型演进之前的模型的问题学习三阶段数据组织和效果评估 注册API调用官方提供的模型官方功能汇总Notion元语AI指令汇总 通用人工智能综述 背景介绍 ChatGPT是一个通用功能型助手。2022年12月5日,OpenAl首席执行言Sam Al…

聚观早报 | 腾势D9用户一半来自原BBA车主;Windows7将彻底退出

今日要闻:App Store创下超3200亿美元营收;腾势D9用户一半来自原BBA车主;微软洽谈100亿美元增持 OpenAI;Windows 7将彻底退出历史舞台;马斯克财富缩水破吉尼斯世界纪录 App Store创下超3200亿美元营收 1月11日消息&am…

Razorpay 印度第三方支付机构 Razorpay 支付,放款,还款实际操作

Razorpay 作为印度本土的一家支付公司,类似中国的支付宝 微信,本篇记录一下对接印度第三方支付公司进行放款,收款操作 先看下支付,上面的截图是整个付款流程 第一步就不说了,这个公司会开好,然后会拿到一个…

海外新兴热点 : Social Token 及该类代币汇总

创新项目分成两种,一种为既定命题提供解决方案,比如 L2,或者各种 AMM,依靠技术的发展轨迹就能对这类项目进行价值判断。另一种是为了提出命题的,比如比特币提出了我们是否需要去中心化货币,这类项目在早期还…

全球银行业巨头汇丰银行在印度推出基于代币化的应收账款系统

点击上方 “蓝色字” 可关注我们! 暴走时评: 根据6月18日的公告,全球主要银行集团汇丰银行已在印度企业客户的应收账款基础设施中落实了数字应收账款工具(HSBC DART),该工具基于澳大利亚的区块链金融科技公…