对比三种认证方式:传统token认证,jwt认证,oauth认证

news2024/12/28 3:54:01

1. Token基本原理

1、客户端使用用户名跟密码请求登录;

2、服务端收到请求,去验证用户名与密码;

3、验证成功,服务端会签发一个Token(也就是随机生成一个字符串)保存到(Session,redis,mysql…)中,然后再把这个 Token 发送给客户端;

4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;

5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;

6、服务端收到请求,验证密客户端请求里面带着的 Token和服务器中保存的Token进行对比校验, 如果验证成功,就继续执行客户端请求的业务逻辑,否则就是验证失败报错返回给客户端;

1.1 token示例

传统的token认证,这个token就是一个随机字符串。服务端收到后,直接拿去查库比对,确认用户信息。

2. jwt认证原理

1、客户端使用用户名跟密码请求登录;

2、服务端收到请求,去验证用户名与密码;

3、验证成功,服务端会在配置文件中配置一个jwt的secret。根据secret签发一个JwtToken,无须存储到服务器,直接再把这个JwtToken发送给客户端;

4、客户端收到JwtToken以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;

5、客户端每次向服务端请求资源的时候需要带着服务端签发的JwtToken;

6、服务端收到请求,使用jwt的secret验证密客户端请求里面带着的 JwtToken,如果验证成功,就继续执行客户端请求的业务逻辑,否则就是验证失败报错返回给客户端;

2.2 jwt token示例

这个服务端和客户端一直传输的jwttoken长啥样呢?长下面这样。

就是一个字符串,分三个部分,通过.连接起来。

Header.Payload.Signature

拆解如下:

base64UrlEncode(header)   + .  + base64UrlEncode(payload)   + .  + 签名(HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret))

2.2.1 header
# JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。
{
   "alg": "HS256",
   "typ": "JWT"
}
# 1)alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);
# 2)typ属性表示令牌的类型,JWT令牌统一写为JWT。
# 3)最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
2.2.2 Payload
#1、有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认 字段供选择。
'''
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT
ID用于标识该JWT
'''

#2、除以上默认字段外,我们还可以自定义私有字段,如下例:
{
"sub": "1234567890",
"name": "chongchong",
"admin": true
}
#3、注意 默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防 止信息泄露。
JSON对象也使用Base64 URL算法转换为字符串保存
2.2.3 签名哈希

签名=HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

# 1.签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
# 2.首先,需要指定一个密码(secret),该密码仅仅为保存在服务器中,并且不能向用户公开。
# 3.然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
# 4.HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
# 5.在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分 隔,就构成整个JWT对象

这样一个结构,服务端拿到这个jwt token后,结合自己的secret 对前面两部分进行签名,再和jwt token中的签名进行对比,就能直接判断这个jwt token的真实性。而不再像传统认证那样去查库才能认证了。

3oauth认证原理


 OAuth(开放授权)是一个开放标准,用于授权一个应用程序或服务访问用户在另一个应用程序中的资源,而无需提供用户名和密码。这使得用户可以安全地分享他们的数据资源,同时保持对其数据的控制。OAuth 2.0在现代互联网应用中被广泛使用,例如,你可以使用你的Google账号登录到其他网站,这就是OAuth的一种应用。

简单来说:OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。

token&jwt  都是系统自己的用户的认证方式。

oauth   是系统允许其他系统的用户来登录自己的系统。比如很多系统需要微信授权登录,实际上就是用户用微信的用户信息,登录自己的系统。作为自己系统的用户。

允许其他用户登录自己系统,还有单点登录。

单点登录,登录一个系统后,自动登录其他系统。

OAuth 2.0广泛应用于各种场景,以下是一些常见的应用场景:

  • 社交登录:用户可以使用他们的社交媒体帐户登录到其他应用程序,例如使用Google或Facebook登录。

  • API访问:开发人员可以使用OAuth 2.0来访问第三方API,例如使用GitHub API或Twitter API。

  • 单点登录:用户可以使用一个身份验证提供商登录到多个相关的应用程序,而无需多次输入凭证。

  • 授权访问:应用程序可以请求用户授权访问其资源,例如Google云存储或Dropbox。

  • 移动应用授权:移动应用程序可以安全地请求访问用户数据,如照片、联系人或位置信息。

3.1认证原理

OAuth 的核心就是向第三方应用颁发令牌。

而oauth定义了获得令牌的四种授权方式:

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

最常用的是授权码模式。

3.1.1. 授权码模式

用户访问想要访问a系统,a系统上有可以用b系统(微信)来登录。用户选择b系统登录,跳转到b系统去授权,用户点击同意授权,接着会返回到b系统中,拿到授权码。这时候用户继续访问a系统。a系统用这个授权码访问b系统(微信)。微信判断这个授权码正确,然后派发token。返回正确。a系统则可以用这个token访问用户在B系统(微信)上的资源。

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

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

相关文章

计算机毕业设计 SpringBoot的企业内管信息化系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

SSD在AI发展中的关键作用:从高速缓存到数据湖-1

随着人工智能技术的飞速发展,存储在其中发挥着至关重要的作用。特别是在AI训练过程中,存储SSD(固态硬盘)的高性能和可靠性对于提升训练效率和保证数据安全具有不可替代的作用。 存储SSD在AI发展中的作用和趋势,存储将…

<url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>的区别

<url-pattern>/</url-pattern> servlet的url-pattern设置为/时&#xff0c; 它仅替换servlet容器的默认内置servlet&#xff0c;用于处理所有与其他注册的servlet不匹配的请求。直白点说就是&#xff0c;所有静态资源&#xff08;js&#xff0c;css&#xff0c;ima…

人工智能数据集可视化统计分析工具:快速了解你的数据集

人工智能数据集可视化统计分析工具&#xff1a;快速了解你的数据集 简介特征示例报告安装用法 简介 Lightly Insights&#xff1a;可以轻松获取关于机器学习数据集基本洞察的工具&#xff0c;可以可视化图像数据集的基本统计信息&#xff0c;仅需提供一个包含图像和对象检测标…

自编码器 AutoEncoder

自编码器&#xff08;AutoEncoder&#xff09;&#xff0c;也称自编码模型&#xff0c;是一种基于无监督学习的数据维度压缩和特征表示方法&#xff0c;目的是对一组数据学习出一种表示。1986年 Rumelhart 提出自编码模型用于高维复杂数据的降维。由于自动编码器通常应用于无监…

建筑学VR虚拟仿真情景实训教学

首先&#xff0c;建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术&#xff0c;学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

SpringData JPA 搭建 xml的 配置方式

1.导入版本管理依赖 到父项目里 <dependencyManagement><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-bom</artifactId><version>2021.1.10</version><scope>…

软文开头怎么写才能拿捏用户?媒介盒子为您解答

软文标题是吸引用户点击的关键因素&#xff0c;那软文开头就是决定用户能否读下去的主要因素&#xff0c;很多运营er在写文案时经常会面临的情况之一就是好不容易想到一个标题&#xff0c;点击率不错&#xff0c;但是开头不行用户一看开头&#xff0c;跑了&#xff01;如果不知…

Git篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、git pull 和 git fetch 有什么区别?二、git中的“staging area”或“index”是什么?三、什么是 git stash?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能&#xff1a; 1.读取XML文件&#xff0c;显示mapping图 2.在mapping视图图标移动&#xff0c;实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值&#xff0c;相机在wafer的中心位置&#…

C# 任务的异常和延续处理

写在前面 当Task在执行过程中出现异常或被取消等例外的情况时&#xff0c;为了让执行流程能够继续进行&#xff0c;可以使用延续方法实现这种链式处理&#xff1b;还可以针对前置任务不同的执行结果&#xff0c;选择执行不同的延续分支方法。子任务执行过程中的任何异常都会被…

Centos7云服务器上安装cobalt_strike_4.7。附cobalt_strike_4.7安装包

环境这里是阿里的一台Centos7系统。 开始安装之前首先要确保自己安装了java11及以上环境。 安装java11步骤&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服务器端&#xff08;CS工具分服务器端和客户端&#xff09;的CS安装到服务器上后给目录下的…

OpenEuler_22.03升级mongdb到7.0.4

使用命令&#xff1a;lscpu&#xff0c;查看cpu架构为aarch64为arm架构的一种执行状态。 所以我们直接下载arm的包安装即可。无需自己编译源码。 下载地址&#xff1a;https://www.mongodb.com/try/download/community 下载解压 wget https://fastdl.mongodb.org/linux/mong…

【LVGL】STM32F429IGT6(在野火官网的LCD例程上)移植LVGL官方的例程(还没写完,有问题 排查中)

这里写目录标题 前言一、本次实验准备1、硬件2、软件 二、移植LVGL代码1、获取LVGL官方源码2、整理一下&#xff0c;下载后的源码文件3、开始移植 三、移植显示驱动1、enable LVGL2、修改报错部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的问题 Undefined symbol …

C语言中的一维数组与二维数组

目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建&#xff1f; int count…

python简易学生管理 + MySQL

数据库表 Python代码部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用户选择的操作"""print("""学生管理系统 1.01.查看所有信息2.查看学生信息3.修改学生信息4.增加学生信息5.退出学生系统"""…

SPI 通信-stm32入门

本节我们将继续学习下一个通信协议 SPI&#xff0c;SPI 通信和我们刚学完的 I2C 通信差不多。两个协议的设计目的都一样&#xff0c;都是实现主控芯片和各种外挂芯片之间的数据交流&#xff0c;有了数据交流的能力&#xff0c;我们主控芯片就可以挂载并操纵各式各样的外部芯片&…

C语言-枚举

常量符号化 用符号而不是具体的数字来表示程序中的数字 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型&#xff0c;他用关键词enum以如下语法来声明&#xff1a; enum枚举类型名字{名字0&#xff0c;…&#xff0c;名字n}&#xff1b; 枚举类型名…

Q_GDW1819-2013电压监测装置协议结构解析

目录 一 专业术语二 基本功能2.1 基础功能2.2 数据存储2.3 显示功能&#xff08;设备能够看到的&#xff09;2.4 参数设置与查询2.5 事件检测与告警功能 三 其他内容3.1 通信方式3.2 通信串口 四 帧结构解析4.1 传输方式4.2 数据帧格式4.2.1 报文头&#xff08;2字节&#xff0…

《深入理解计算机系统》学习笔记 - 第四课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…