JWT不是为了授权而设计的

JWT不是为了授权而设计的,只是用作身份验证。

JWT 主要用于验证身份。由于大多数开发人员不会开发自己的身份验证解决方案,因此身份验证提供商的 SDK 可能会为您完成此操作。您最终从 JWT 获得的是身份本身。

这很好,因为 JWT 是可验证的用户配置文件的最佳来源。因此,您可能不需要亲自验证 JWT,但您可以并且应该将其用作用户身份的真实来源。

除此之外,您还可以使用 JWT 来扩展身份验证提供程序的功能。由于 JWT 是可自我验证的,因此您可以将其用于其他服务,而无需您的身份验证服务参与。

例如,这意味着您可以创建一个内部 OAuth 服务器,让开发人员以更安全可靠的方式使用内部数据。您还可以在共享 API 身份验证或机器对机器身份验证时使用 JWT,因为 JWT 是可验证的。

底线 - JWT 应该用于验证,并作为用户身份和用户资料的真实来源。

JWT 不是什么
用户登录并完成身份验证过程后,我们将进入授权阶段 - 决定用户在我们的应用程序中可以做什么或不能做什么。在此步骤中,我们唯一可验证的是基于 JWT 的用户身份。

JWT 的主要组成部分是其有效负载,其中包含我们可以识别的用户 ID。由于授权与身份验证紧密相关,因此用户不断在此有效负载中存储越来越多的数据。

为了使事情变得简单且不付出太多努力,许多开发人员决定检索 JWT 中的属性并将其与应用程序中的命令式代码配对。这通常会导致出现类似“如果 JWT 角色等于某项,则允许/拒绝某项”的语句。有时,当他们想要创建更动态的东西时,他们会添加一个外部函数来根据 JWT 获取角色。

这是因为许多开发人员将 JWT 的可验证性质视为适合验证权限的东西。

正如我们前面提到的,大多数开发人员在需要处理用户授权时首次接触 JWT。大多数开发人员并不真正了解验证过程,最终由身份验证服务为您提供 JWT。

此时,由于 JWT 可以承载一些定义应用程序中权限的基本范围和声明,许多开发人员倾向于认为,“现在用户已经通过验证,我可以使用此令牌来定义用户应该拥有什么访问权限”。

虽然角色和声明在我们的应用程序权限中扮演着重要的角色,但它们不足以完全定义它们。将 JWT 视为授权组件的这种做法存在两个问题:

  1. 虽然 JWT 是过去几年软件开发领域最伟大的发展之一,但它们并不用于授权。
  2. 使用 JWT 作为管理应用程序内用户访问的唯一方法可能会对应用程序的安全性造成灾难性的后果。

JWT 是静态的
从授权角度来看,我们可以立即看到这种方法过于静态。让我们以基于角色的访问控制 (RBAC) 为例。在 RBAC 中,我们扮演用户的角色并确定他们是否可以执行特定操作或动作。RBAC 并不止于角色 - 即使像 RBAC 这样简单的授权模型也包含更多组件,例如用户尝试执行的操作以及他们正在执行该操作的资源。

JWT 仅包含这三个组件的第一部分——用户及其可能分配的角色。如果将用户角色作为 JWT 的一部分传递,则无法创建动态角色,从而使我们的授权层完全静态。这意味着在令牌过期之前,过期的权限将一直有效。

例如,如果我有一个管理员用户,我想将其降级为标准用户,除非撤销 JWT,否则我无法这样做。由于 JWT 原则上是可验证的,因此在令牌过期之前无法撤销它。

通常,现在的 JWT 的生存期非常短,因此对于访问令牌,TTL(生存时间)可能约为 60 秒,并且 SDK 会为您刷新它们。因此,我们不能仅仅依赖 JWT 上的角色。

JWT 不够细粒度
由于 JWT 仅包含有关个人用户的信息,因此您可以(并且应该)在其中存储的数据量有非常严格的限制。对于基于属性的访问控制 (ABAC)和基于关系的访问控制 (ReBAC)等模型,使用 JWT 直接创建授权查询变得不可能。

JWT 有大小限制。这意味着,如果我们想授予用户访问 1000 个文件的权限,就必须创建一个 20,057 个字符的 JWT — — 这还只是考虑到一个简单的文件名。如果使用完整路径名,那么长度会更长。

设计授权层的第一步是确定需要管理访问权限的资源。每种类型的资源及其在应用程序整体结构中的位置可能要求您使用不同类型的授权模型(RBAC、ABAC、ReBAC 或它们的组合)。使用 JWT 可能是一种快速的临时解决方案,但它远非可持续。

重要的是,你 要熟悉现有的策略模型、它们的优缺点,并尝试评估哪些模型最适合你的应用

JWT 在授权中应该扮演什么角色?
JWT 并非用于授权,而是用于验证、交换令牌和基于令牌的身份验证。如果我们按照 JWT 的本意使用它们,即作为用户身份的真实来源,那么我们就可以利用它们向外部授权服务查询用户可以做什么或不能做什么。但是,这种使用不应将任何授权逻辑作为 JWT 本身的一部分。

相关:https://www.jdon.com/74012.html

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

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

相关文章

Follow Carl To Grow|【LeetCode】669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树

【LeetCode】669. 修剪二叉搜索树 题意:给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有…

生成隐藏图

什么是隐藏图?请在手机版小红书上打开此链接双指放大图片观看。 本人还写了一个QT程序,可以通过傻瓜式操作生成隐藏图,有兴趣可以自行体验。 主要就是根据透明度展示原理去针对一个通道列方程,然后发现把前景图的色值全部映射到 1…

【Linux】 安装rz 和sz

在 Linux 系统中,rz 和 sz 是两个用于在本地计算机与远程计算机之间安全传输文件的命令行工具。它们是 lrzsz 包的一部分,通常用于通过 SSH 连接传输文件。 打开终端: 首先,打开你的 CentOS 机器上的终端。 执行sz 提示下面信息…

王学岗鸿蒙开发(北向)——————(七、八)ArkUi的各种装饰器

arts包含如下:1,装饰器 ;2,组件的描述(build函数);3,自定义组件(Component修饰的),是可复用的单元;4,系统的组件(鸿蒙官方提供);等 装饰器的作用:装饰类、变量、方法、结…

下划线对象转驼峰

场景: Json的字符串转对象,并且字符串的的属性是下划线,对象的属性是驼峰 ,用在对象中设置属性的方法实现。 方法: import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMa…

ROS自带的OpenCV库和自己安装版本冲突问题现象及解决方法

文章目录 1. 问题现象1.1 编译过程警告1.2 程序运行报错 2. 分析问题原因3. 解决方法 1. 问题现象 1.1 编译过程警告 warning: lipopencv_improc.so.406, needed by /usr/local/lib/libopencv_xfeatures2d.so.4.6.0, may conflict with libopencv_imgproc.so.4.21.2 程序运行…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(五)---- 操作系统的组织结构(OS design)

系列文章目录 操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建&#x…

【机器人和人工智能——自主巡航赛项】进阶篇

文章目录 案例要求创建地图rviz仿真 保存地图坐标点定位识别训练主逻辑理解语音播报模块匹配二维码识别多点导航讲解视频其余篇章 案例要求 创建地图 ./1-gmapping.sh 把多个launch文件融合在sh文件里面 rviz仿真 rviz是rose集成的可视化界面,查看机器人的各项数…

CPP初级:模板的运用!

目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程:编写与类型无关的通用代码…

vs2019 c++20规范 全局函数 ref 及模板类 reference_wrapper<_Ty> 的源码分析

这是个引用&#xff0c;可以包裹一个对象&#xff0c;相当于引用该对象&#xff0c;而不是在作为函数形参时产生值传递。因为模板 reference_wrapper<_Ty> 其实是封装了该对象的地址。下面以图示形式给出其重要的成员函数。模板其实都差不多&#xff0c;跟人也一样&#…

Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持

因个人需要&#xff0c;mkfs.ext3 但是项目中还没有这个命令 所以琢磨了半天 这里将其小记一下 在buildrootfsz中&#xff0c;需要将e2fsprogs 勾选上然后重新编译就好了 make menuconfig Target packages-> Filesystem and flash utilities-> e2fsprogs

WDF驱动开发-电源策略(二)

支持单组件设备呈现单个或多个功能性电源状态 驱动程序可以为组件定义一个或多个功能电源状态&#xff0c;并注册电源管理框架 (PoFx) 在组件的 Fx 状态更改或其活动/空闲条件更改时调用的回调函数。 从 UMDF 版本 2.0 开始&#xff0c;单组件设备的 UMDF 驱动程序可以定义单个…

23种设计模式——创建型模式

设计模式 文章目录 设计模式创建型模式单例模式 [1-小明的购物车](https://kamacoder.com/problempage.php?pid1074)工厂模式 [2-积木工厂](https://kamacoder.com/problempage.php?pid1076)抽象⼯⼚模式 [3-家具工厂](https://kamacoder.com/problempage.php?pid1077)建造者…

JVMの静、动态绑定异常捕获JIT即时编译

在说明静态绑定和动态绑定之前&#xff0c;我们首先要了解在字节码指令的层面&#xff0c;JVM是如何调用方法的&#xff1a; 例如我有以下的代码&#xff0c;很简单就是在main方法中调用了另一个静态方法&#xff1a; public class MethodTest {public static void main(Strin…

详细说说机器学习在交通领域的应用

机器学习在交通领域的应用广泛而深入&#xff0c;以下是对其应用的详细归纳和分点表示&#xff1a; 自动驾驶技术&#xff1a; 自动驾驶技术是机器学习在交通领域中最具代表性的应用之一。通过大量数据的训练&#xff0c;自动驾驶车辆能够在不同的交通环境和场景中完成智能化的…

论文阅读——MIRNet

项目地址&#xff1a; GitHub - swz30/MIRNet: [ECCV 2020] Learning Enriched Features for Real Image Restoration and Enhancement. SOTA results for image denoising, super-resolution, and image enhancement.GitHub - soumik12345/MIRNet: Tensorflow implementation…

结构化查询语言SQL

SQL SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索。 SQL 分类 SQL是结构化查询语言(Structure Query Lang…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值&#xff08;数字&#xff…

C语言指针与数组的区别

在C语言中&#xff0c;指针和数组虽然在很多情况下可以互换使用&#xff0c;但它们在概念上和行为上存在一些区别。下面详细解释这些区别&#xff1a; ### 数组 1. **固定大小**&#xff1a;数组在声明时必须指定大小&#xff0c;这个大小在编译时确定&#xff0c;之后不能改…

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…