OAuth 2.1 带来了哪些变化

6710fa655be155ee929e1e1ad8b847e9.png

OAuth 2.1 是 OAuth 2.0 的下一个版本, OAuth 2.1 根据最佳安全实践(BCP), 目前是第18个版本,对 OAuth 2.0 协议进行整合和精简, 移除不安全的授权流程, 并发布了 OAuth 2.1 规范草案, 下面列出了和 OAuth 2.0 相比的主要区别。

⚡ 推荐使用 Authorization Code + PKCE

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 2.1.1 章节[1]

授权码 (Authorization Code) 模式大家都很熟悉了,也是最安全的授权流程, 那 PKCE 又是什么呢? PKCE 全称是 Proof Key for Code Exchange, 在 2015 年发布为 RFC 7636, 我们知道, 授权码模式虽好, 但是它不能给公开的客户端用, 因为公开的客户端没有能力保存好秘钥(client_secret), 所以在此之前, 对于公开的客户端, 只能使用隐式模式和密码模式, PKCE 就是为了解决这个问题而出现的, 另外它也可以防范授权码拦截攻击, 实际上它的原理是客户端提供一个自创建的证明给授权服务器, 授权服务器通过它来验证客户端,把访问令牌(access_token) 颁发给真实的客户端而不是伪造的,下边是 Authorization Code + PKCE 的授权流程图。

30cee383153fb81cab8e225cde43a613.png

⚡隐式授权( Implicit Grant)已弃用

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 2.1.2 章节[2]

在 OAuth 2.1 规范草案中, 授权模式中已经找不到隐式授权(Implicit Grant), 我们知道, 隐式授权是 OAuth 2.0 中的授权模式, 是授权码模式的简化版本, 用户同意授权后, 直接就能返回访问令牌 access_token, 同时这种也是不安全的。

0123c34ffac01708cea38ff228324910.png

现在您可以考虑替换为 Authorization Code + PKCE 的授权模式。

⚡ 密码授权 (Resource Owner Password Credentials Grant)已弃用

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 2.4 章节[3]

在 OAuth 2.1 规范草案中, 密码授权也被移除, 实际上这种授权模式在 OAuth 2.0中都是不推荐使用的, 密码授权的流程是, 用户把账号密码告诉客户端, 然后客户端再去申请访问令牌, 这种模式只在用户和客户端高度信任的情况下才使用。

试想一下, 在你手机上有一个网易云音乐的APP, 现在要使用qq账号登录, 这时网易云音乐说, 你把qq账号密码告诉我就行了, 我拿着你的账号密码去QQ那边登录, 这就很离谱了!

正确的做法是, 用户在网易云音乐要使用qq登录, 如果用户也安装了qq 的客户端, 应该唤起qq应用, 在qq页面完成授权操作, 然后返回到网易云音乐。如果用户没有安装qq客户端应用, 唤起浏览器, 引导用户去qq的授权页面, 用户授权完成后, 返回到网易云音乐。

请注意, OAuth 是专门为委托授权而设计的,为了让第三方应用使用授权, 它不是为身份验证而设计的, 而 OpenID Connect(建立在 OAuth 之上)是专为身份验证而设计, 所以, 在使用 OAuth 授权协议时, 你需要知道你使用的客户端是第三方应用程序还是第一方应用,这很重要!因为 OAuth 2.1 已经不支持第一方应用授权!

现在您可以考虑使用 Authorization Code + PKCE 替换之前的密码授权模式。

⚡ 使用 access_token 时, 不应该通过 URL 传递 token

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 4.3.2 章节[4]

在使用 access_token 时, 您不应该把token放到URL中, 第一, 浏览器地址栏本来就是暴露的, 第二, 可以查看浏览记录,找到 access_token。

正确的做法是, 把 access_token 放到 Http header 或者是 POST body 中。

⚡ 刷新令牌 (Refresh Token) 应该是一次性的

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 4.13.2 章节[5]

access_token 访问令牌, refresh_token 刷新令牌, 刷新令牌可以在一段时间内获取访问令牌, 平衡了用户体验和安全性, 在 OAuth 2.1 中, refresh_token 应该是一次性的, 用过后失效, 使用 refresh_token 获取access_token时, 还可以返回一个新的 refresh_token。

5a95fecfd44b53ac3113f8c52c7b8b2c.png

⚡ 回调地址(Redirect URI)应该精确匹配

根据 OAuth 2.0 安全最佳实践(Security Best Current Practices) 4.1.3 章节[6]

在 OAuth 2.0 的授权码流程中, 需要设置一个回调地址 redirect_uri, 如下

https://www.authorization-server.com/oauth2/authorize?response_type=code&client_id=s6BhdRkqt3&scope=user&state=8b815ab1d177f5c8e &redirect_uri=https://www.client.com/callback

假如有三个不同的客户端

•a.client.com•b.client.com•c.client.com

这时可能会使用一个通配符的 redirect_uri, 比如 *.client.com, 这样会有什么风险呢? 实际上, 恶意程序有机会篡改 redirect_uri, 假设恶意程序的域名是 https://attacker.com, 然后把 redirect_uri 改成 https://attacker.com/.client.com, 这样授权码就发送给了恶意程序。

References

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-04

5b1f9c0cc2181243c44a32edd9a21a64.png

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

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

相关文章

转仁兄:Binary search and its variation

http://fihopzz.blogspot.com/2013/07/enter-post-title-here-binary-search-and.html转载于:https://www.cnblogs.com/kwill/p/3230655.html

生孩子要趁早 3

说到猝死,前两天又有报道说哪个搞IT的年纪轻轻的嗝儿屁了;我想:其实哪个行业都有这么几个倒霉孩子;这也就是搞网络报道的公司的身边的事儿,才被程序员们通过网络转来转去;那些搬砖、运煤的就没有年纪轻轻累…

使用OClint进行iOS项目的静态代码扫描

使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要一个静态分析代码工具,帮助我们发布运行应用前找到代码潜在的问题。 其实对于iOS开发,我们的日常开发上已经用…

Linux命令常用大全

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo…

54个站在人类智商巅峰的男人!告诉你2400年的物理学史里都有什么……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不至于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

C#实现ByteBuffer类 .

在写网络程序的时候,经常需要往一个数组里面压数据或者取数据,而Java中再Java.nio中有个ByteBuffer能很方便的实现,Delphi中也有个Stream类有着同样的功能,这里我就模仿JAVA用C#做个最基础的ByteBuffer类 下面是代码 usingSystem;namespaceSystem.ByteBuffer...{ /**//// &l…

mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰

一.NOT NULL(非空约束)添加非空约束1)建表时直接添加CREATE TABLE t_user(user_id INT(10) NOT NULL);2)通过ALTER 语句ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;删除非空约束1)ALTER TABLE t_user MO…

asp.net 6中的mini api和mvc api性能对比

在.net6发布时,带来了一个新的模板框架,mini api,那与之前的mvc api性能对比是什么样的呢?建了基于.net 6的两种模板项目,都实现了一个get /test01的api请求,代码如下:mini api:app.MapGet(&quo…

lsass.exe文件丢失,损坏

有一天因为WSUS下发策略的时候更新了某些补丁,导致了系统在登录的时候提示lsass.exe文件丢失,损坏,一时间用了修复工具和恢复使用前都不行,于是好好研究了下。在一台完好使用的同一个系统的PC上复制了system32里面的lsass.exe&…

利用Guava的Suppliers.memoize实现单例

序 本文主要介绍如何利用Guava的Suppliers.memoize实现单例。 实例 /*** 利用Suppliers.memoize实现单例* Created by xixicat on 15/12/25.*/ public class SuppilerSingletonTest {class HeavyObject{public HeavyObject() {System.out.println("being created");}…

Android之水平ProgressBar多彩背景颜色

ProgressBar多彩的背景颜色 不废话,先爆照,如下图。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_wi…

冰箱堪比「垃圾桶」?这根棒除味又保鲜,更能 99% 超强杀菌!

{}▲ 点击查看每天的饭菜、生鲜、零食、饮料、干货&#xff0c;总能把我家冰箱塞得满满当当。各种饭菜干货窜味儿&#xff0c;蔬果开始发烂发臭&#xff0c;每天打开冰箱都是一次「开门杀」……用柚子皮和竹炭包除味根本不行&#xff0c;从根源上改善冰箱环境才是硬道理。跟市面…

mac apache2 php,Mac OSX 之 PHP开发环境Apache2配置

time : 2018-03-23author : HGD_IS 李亮星一.事件因果一个星期前&#xff1a;不想下载XAMMP或者MAMP之类的IDE&#xff0c;而且下载完谷歌服务器一直只有放弃按钮&#xff0c;在Finder中打开也是不可打开文件状态&#xff0c;谷歌浏览器给出的解释是该App可能损害我的电脑&…

如何通过 C# 生成安全的 Base64 URL 字符串?

咨询区 Vishvesh Phadnis&#xff1a;在 C# 中如何实现对 URL 进行安全的 base64 编码&#xff0c;在 JAVA 中我可以使用 Codec 类库来实现此功能&#xff0c;我目前是这么实现的。byte[] toEncodeAsBytes System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode&quo…

System.getProperty()参数

java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specificat…

不变模式

不变模式 不变模式&#xff08;immutable pattern&#xff09; 一个类的内部状态创建后&#xff0c;在整个生命期间都不会发生变化时&#xff0c;就是不变类。这种使用不变类的做法叫做不变模式。 不变模式有两种形式&#xff1a;一种是弱不变模式&#xff0c;另一种是强不变模…

了解SQL Server触发器及触发器中的事务

引述 首先&#xff0c;写这篇文章的目的是望能把我对触发器的理解&#xff0c;分享出来与大家一起学习。如果你对触发器和事务的概念有些了解&#xff0c;这篇文章对你来说会是很简单&#xff0c;或能让你更进一步的了解触发器里面的一些故事&#xff0c;以及触发器中事务的故…

swift学习笔记-----swift中的指针

swift语言为了简化&#xff0c;把指针隐形化了。没有像OC中那样的“ * ”。把底层的问题交给C语言去处理&#xff0c;我们可以在swift中调用C 语言来解决。当然&#xff0c;OC也是可以调用的。但是在某些场景下&#xff0c;这种调用可能不是很方便。比如&#xff0c;基于字节流…

多个php一个机器,如何利用docker在同一台机器上搭建多套php开发环境?

首先是一个容器要包含完整的程序加依赖(出去中间件)&#xff0c;拿 LNMP 举例子&#xff1a;docker 提供的是 Linux 环境&#xff0c;容器中要包含 Nginx 和 Php&#xff0c;然后再单独部署一个 MySQL其次&#xff0c;如果多个环境&#xff0c;可以使用多个容器&#xff0c;简单…

Android之Android studio如何解决Multiple dex files define Landroid/support/a(文件重复引用错误)

先爆错误的图片照,如下 define 可以理解文件重复的意思,所以这个错误是我导入了v4.jar包的原因,因为我项目里面本来就有v7.jar,如下图 解决办法一: 既然重复了,我就把这个v4.jar包删除掉,我删了之后就可以了,这个方法的前提是我知道哪个包重复了,不然我也不知道删除…