OAuth 2.1 的进化之路

f275de10e127ae8fd48f32c094722d2b.png

背景

2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布(rfc 6749), 这也是大家最熟悉并且在互联网上使用最广泛的版本, 在2012年的时候, iPhone 5 是全新的, 微软最新的浏览器还是 IE9, 单页面应用在当时还被称作 "Ajax 应用", CORS(跨域资源共享)还不是一个W3C标准。

到现在, 网络和移动领域发生了巨大的变化, 当时发布的授权协议标准已经远远不能满足现在的场景和需求, 为了应对这种不断变化的局面, OAuth 社区多年来一直在修补和扩展 OAuth 规范, OAuth 的格局也不断扩大, 越来越多的围绕 OAuth 2.0 core 的扩展授权规范出现, 也让 OAuth 2.0 整体看起来就像一个迷宫一样。

e4de7da8f717407ec7df635a9fe7da97.png

不断进化的 OAuth 2.0

在 OAuth 2.0 核心规范 (RFC 6749)中, 定义了四种授权类型:授权码、隐式、密码和客户端凭据, 如下:

21922f8ebabe96027a505690c2fa1d57.png

相信大家都很熟悉, 在 OAuth 2.0 中,最安全也是使用最普遍的就是授权码模式, 而对于本地应用,移动应用来说, 通常会使用隐式和密码授权, 这两种本身就是不安全的, 因为这些属于公开的客户端, 本身没有能力保护客户端机密, 但是当时并没有其它好的方案。

为了解决 OAuth 2.0 对公开客户端的授权安全问题, PKCE (RFC 6379)协议应运而生, 全称是 Proof Key for Code Exchange,PKCE 的原理是, 对于公共的客户端, 如果不能使用客户端秘钥(client_secret), 那客户端就提供一个自创建的证明 (code_verifier) 给授权服务器,其中使用了加密算法, 授权服务器通过它来验证客户端。

3f9e09b897e431b987d1bde46e3dabb2.png

后来,"OAuth 2.0 for Native Apps"(RFC 8252)规范发布,推荐原生应用也使用授权码 + PKCE。

8b6bf83514755f5235bf766ddade7c7c.png

随着技术不断地发展, 出现了设备授权的场景, 这里设备指智能电视,打印机等, 和传统的PC或者手机不同, 这种设备是缺少浏览器或者键盘的,那 OAuth 2.0 常规的授权模式肯定是不能满足的, 于是就出现了设备授权(Device Grant) 。

1ed394ccc6b597546758c628fde14765.png

在 OAuth 2.0 安全最佳实践(Security BCP)中, 弃用了隐式和密码授权,并且推荐所有的客户端都应该使用 Authorization Code + PKCE 的组合。

823519e317b9659cd88c750b782bc7a3.png

最终, 调整后的 OAuth 授权模式会更加精简, 转换成下面三种, 这也是 OAuth 2.1 的思想, 参考安全最佳实践(BCP),取其精华, 去其糟粕。

fe3f1e6dc7a7b2bad30c5d6681153ada.png

总结

归根结底, OAuth 2.1 并不是要推翻 OAuth 2.0,而是根据其安全最佳实践(BCP), 移除不安全的授权流程, 并且对扩展协议进行整合, 让原本复杂如迷宫的 OAuth 2.0 规范成为更易用,更安全的授权规范。

87970d433b73cc2636a58242b11c5e95.png

References

The OAuth 1.0 Protocol[1]
The OAuth 2.0 Authorization Framework[2]
The OAuth 2.1 Authorization Framework draft-ietf-oauth-v2-1-04[3]
It's Time for OAuth 2.1[4]
OAuth 2.0 for Native Apps[5]
OAuth 2.0 Device Authorization Grant[6] Proof Key for Code Exchange by OAuth Public Clients[7]

1fba4b3616761e5a9ec7478d19136aed.png

相关链接

[1] The OAuth 1.0 Protocol: https://datatracker.ietf.org/doc/html/rfc5849
[2] The OAuth 2.0 Authorization Framework: https://www.rfc-editor.org/rfc/rfc6749
[3] The OAuth 2.1 Authorization Framework draft-ietf-oauth-v2-1-04: https://datatracker.ietf.org/doc/draft-ietf-oauth-v2-1/
[4] It's Time for OAuth 2.1: https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1
[5] OAuth 2.0 for Native Apps: https://www.rfc-editor.org/rfc/rfc8252.html
[6] OAuth 2.0 Device Authorization Grant: https://datatracker.ietf.org/doc/html/rfc8628
[7] Proof Key for Code Exchange by OAuth Public Clients: https://www.rfc-editor.org/rfc/rfc7636.html

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

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

相关文章

php中怎样表示组合框,php – 如何实现动态组合框选择系统

诀窍是订阅更改事件并相应地重置第二个框的内容.HTML:- select -NokiaAppleJavaScript(准备好了):var selectBrand $("#brand");var selectType $("#type");var optionsList {nokia: ["C6-01","E7-00"],appl…

用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突

用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突 这几天一直由于之前的的项目实现的功能没有提交,git客户端我用的是smartGit,然后用着用着需要那个licesenc,反正要一个有效的生成文件,然后我就想解决办法。 方法一: 我就到网上找,csd…

中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!

全世界只有3.14 % 的人关注了爆炸吧知识一个热爱音乐的科研工作者最近,有不少模友在后台问,如何如何去平衡好学习/工作和兴趣爱好之间的关系?很多人会说这么简单的问题,为什么还要问?其实并不简单,在现实生…

Nginx源码安装及应用

一:Nginx简介: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。 Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持Rails和PHP 程序对外进行服务&…

宝藏好物gRPCurl

gRPCurl简介gRPCurl[1]是一个与gRPC服务器交互的命令行工具,可认为是gRPC的curl工具。gRPCurl用于从命令行调用gRPC服务器支持的RPC方法,gRPC使用二进制编码(protobuf), 不能利用常规的curl工具(早期的curl版本还不支持HTTP/2)。1. gRPCurl工具接受json编…

数组与链表的对比

特点对比:1、存取方式上,数组可以顺序存取或者随机存取,而链表只能顺序存取;2、存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定;3、存储空间上,链表由于带有指…

php 查询数据是否大于,怎么实现从数据查询数据的时候判断如果数据大于N条分次查询 递归吗?...

比如数据库有300000条数据 现在根据条件查询符合的有30000条数据 一次取太多了可能慢或者其他问题 我想每次取10000 三次取完 这只是个例子 应该怎么实现啊?用递归吗?告知下 谢谢!!!还有就是如果查俩张表的数据 合并在…

黑白图像(DFS)

输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如图6-11所示的图形有3个八连块。 图6-11 拥有3个八连块的黑白图形 【分析…

快速学习使用springmvc、strust2、strust1以及它们的对比

1、如何快速学习springmvc 首先,我们需要在复制spring相关的jar包到web-inf/lib里面去,然后在web.xml里面加入以下代码,相当于springmvc里面的servlet,这里只说明了一些常见的用法,如果要了解springmvc里面的控制器这些详细原理可…

你的输入法都暴露了些啥?

1 三哥对柠檬茶下手了要不要来一杯?▼2 能成功求婚的应该就是真爱了吧?▼3 气泡的花样玩法▼4 很正确?▼5 高手过招!牛▼6 幽默中带着点死亡气息▼7 输入法:我暴露了一切▼你点的每个赞,我都认真当成了…

从 ThreadLocal 到 AsyncLocal

前些天跟大佬们在群里讨论如何在不使用构造函数,不增加方法参数的情况下把一个上下文注入到方法内部使用,得出的结论是 AsyncLocal 。感叹自己才疏学浅,居然才知道有 AsyncLocal 这种神器。于是赶紧恶补一下。ThreadLocal 要说 AsyncLocal 还…

Sersync+Rsync 增量实时同步

准备环境: rsync服务器:172.16.3.21sersync2服务器:172.16.3.23一、 rsync服务器先把原来的rsync包删掉yum remove rsync-2.6.8-3.1 -y,然后到http://rsync.samba.org/下载rsync包我用的包如下图所示利用securecrt上传本地[rootacong tongbu1…

浅谈RBF函数

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。 最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc…

Repeater嵌套绑定Repeater

cs代码: private void RpTypeBind() {//GetQuestionTypeAndCount() 返回一个datatable this.rptypelist.DataSource LiftQuestionCtr.GetQuestionTypeAndCount(); this.rptypelist.DataBind(); } …

字符串之变形数

字符串之变形数 题目:给定2个字符串str1和str2,如果str1和str2出现的字符种类和每个字符出现的个数也一样,那么str1与str2互为变形数。请用函数实现。 例子:str1="123", str2="231" 返回 true 例子:str1="123", str2="2311" 返回…

一个彻底改变世界的思想

全世界只有3.14 % 的人关注了爆炸吧知识因随机性的到来阔然开朗蒙特卡罗赌场蒙特卡罗(Monte Carlo)是摩纳哥公国(Principality of Monaco)的一座城市。摩纳哥公国坐落在法国的东南方,总面积为2.02平方公里,…

单元测试 | 如何在Mock时匹配匿名类型参数

前言假设&#xff0c;我们需要单元测试如下方法:public User GetUser(int id) {return Repository.Query<User>(new { ID id }).FirstOrDefault(); }而对于Repository.Query&#xff0c;我们需要进行Mock。怎么实现&#xff1f;不匹配具体参数值如果我们不关心参数的具体…

java中imp结尾,imp java

适配器模式之桥梁模式设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435风.fox桥梁模式 Bridge Pattern将抽象和实现解耦&#xff0c;使得两者可以独立地变化通用类图组成抽象化角色 Abstraction...文章风来了2016-10-06972浏览量expOracle数据导入导出i…

Cookies

一&#xff0c;前言 Cookies想必所有人都了解&#xff0c; 但是未必所有人都精通。本文讲解了Cookies的各方面知识。 二&#xff0c;基础知识 1.什么是Cookies Cookie 是一小段文本信息&#xff0c;伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问…

用字符串表达式访问JSON数据(java,fastjson)

2019独角兽企业重金招聘Python工程师标准>>> //单元科技-www.ccell.com.cn 技术部,开源 //XML数据有XPATH 如"root/rows[id1]/name" //在JS中JSON数据可以对象方式访问 //java中怎么 用字符串表达式访问JSON数据? 找了很久没有找到,自己写一个,以减小代…