OAuth从1.0到2.1的发展之路

 更新时间:2021年11月23日 16:23:35   作者:SpringLeee  
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。简单来说就是提供除了"账户密码"验证方式以外的验证授权方式。这篇文章介绍了OAuth从1.0到2.1的发展之路,感兴趣的同学可以收藏一下

背景

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 整体看起来就像一个迷宫一样。

不断进化的 OAuth 2.0

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

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

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

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

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

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

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

总结

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

参考资料

The OAuth 1.0 Protocol
The OAuth 2.0 Authorization Framework
The OAuth 2.1 Authorization Framework draft-ietf-oauth-v2-1-04
It's Time for OAuth 2.1
OAuth 2.0 for Native Apps
OAuth 2.0 Device Authorization Grant
Proof Key for Code Exchange by OAuth Public Clients

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 自动驾驶技术之V2X技术的介绍

    自动驾驶技术之V2X技术的介绍

    本章内容介绍了如何利用车辆自身的智能,还可以借助外部环境实现信息的获取,这一类技术统称为V2X技术。接下来我们大家一起来学习吧
    2021-08-08
  • aop的实现原理_动力节点Java学院整理

    aop的实现原理_动力节点Java学院整理

    这篇文章主要介绍了aop的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 使用 tke-autoscaling-placeholder 实现秒级弹性伸缩的方法

    使用 tke-autoscaling-placeholder 实现秒级弹性伸缩的方法

    这篇文章主要介绍了使用 tke-autoscaling-placeholder 实现秒级弹性伸缩的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详情解析TCP与UDP传输协议

    详情解析TCP与UDP传输协议

    本文通过讲解TCP与UDP传输协议传输数据是的过程及详细介绍什么是 socket及现在我么们和大家一起来学习吧
    2021-08-08
  • VSCode远程连接服务器报错:Could not establish connection to

    VSCode远程连接服务器报错:Could not establish connection to

    本文主要介绍了VSCode远程连接服务器报错的解决,文中通过图文代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • RPC、RMI、SOAP的区别详解

    RPC、RMI、SOAP的区别详解

    这篇文章主要介绍了RPC、RMI、SOAP的区别详解,本文还同时讲解了RPC、SOAP、WSDL的关系,需要的朋友可以参考下
    2015-07-07
  • 科学知识:理解socket

    科学知识:理解socket

    这篇文章主要介绍了科学知识:理解socket,本文试图用简洁的语言说清楚socket的相关知识,以便理解,需要的朋友可以参考下
    2015-05-05
  • C1任务01之修改游戏存档的方法

    C1任务01之修改游戏存档的方法

    这篇文章主要介绍了C1任务01之修改游戏存档的相关知识,前三个任务会用到十六进制编辑器来实现,在修改的的过程中涉及到的知识点为十进制数据与十六进制之间数据的相互转换,需要的朋友可以参考下
    2021-10-10
  • 在CODEIGNITER中 在CI中引入外部的JS与CSS呢

    在CODEIGNITER中 在CI中引入外部的JS与CSS呢

    其实不管是在用CI还是ZF都有同样一个问题,就是路径的问题。前期,我在用ZF做CMS时,我在.htaccess文件中设置了如遇到js,css,img等资源文件都不重定向。
    2009-07-07
  • VS2019 自定义项目模板的实现方法

    VS2019 自定义项目模板的实现方法

    这篇文章主要介绍了VS2019 自定义项目模板的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论