JWT详细介绍

news2024/11/25 13:26:06

文章目录

    • 1 jwt介绍
      • 1.1 什么是jwt
      • 1.2 使用场景
        • 1.2.1 授权
        • 1.2.2 信息交换
      • 1.3 JWT结构
        • 1.3.1 header
        • 1.3.2 payload
        • 1.3.3 signature 签名
    • 2 Python 实现
      • 2.1 手动编码
      • 2.2 jwt包
    • 3 校验 jwt
    • 5 js解析jwt

1 jwt介绍

官网:https://jwt.io/
本文以python来进行实战演示

1.1 什么是jwt

JSON Web Token (JWT) 是一个开放标准 ( RFC 7519 ),它定义了一种紧凑且自包含的方式,用于以json的方式安全传输信息,并且通过数字签名来保证信息是信任的。jwt可以使用秘钥(HMAC算法)或RSA或ECDSA的公钥/私钥对其进行签名。

1.2 使用场景

1.2.1 授权

用户在登录后,后续每个请求都将包含JWT,从而判断用户是否登录、是否有权限等操作。这种方式也被称为单点登录,其开销非常小,并且能够在不同的域中轻松使用。

在Web开发中,我们通常会使用cookie或token的方式进行用户身份验证,jwt是属于token方法实现的一种,下面列出token方式的优点:

  • 支持跨域访问
  • 无状态:token本身就包含了用户信息,无需保存在服务端。
  • 适合移动端:如微信小程序、移动设备不支持cookie的客户端。
  • 无需考虑CSRF

1.2.2 信息交换

由于可以对JWT进行签名(例如:使用公钥/私钥),因此您可以确定数据发送者是否为本人。另外,由于使用标头和有效负载计算签名,我们可以验证内容是否被篡改。

JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都讲包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。

1.3 JWT结构

JWT由3部分内容构成,并且以( . )作为分隔:

格式:标题.有效载荷.签名/``

1.3.1 header

{
	'alg':'HS256', 
	'typ':'JWT'
}

alg:代表要使用的算法
typ:代表token类别,这里为 大写 JWT

此部分数据使用转为json并 base64 进行加密。

1.3.2 payload

1、共有声明(按需项,用户自定义添加)

{
	'exp':xxx, # Expiration Time 此token的过期时间的时间戳
	'iss':xxx,# (Issuer) Claim 指明此token的签发者
	'iat':xxx, # (Issued At) Claim 指明此创建时间的时间戳
	'aud':xxx, # (Audience) Claim	指明此token签发面向群体
}

2、私有声明(用户自定义key、value)

{
	'username':'charles'
}

转为json并用base64加密

1.3.3 signature 签名

这里要采用header中的算法进行,这里使用HS256算法

# 伪代码
HS256(自定义key, base64(header), base64(payload))

2 Python 实现

2.1 手动编码

"""
    jwt生成
"""
import json
import time

from common.util_encryption import hash_tool


class Util_jwt:
    def __init__(self, header, payload, secret):
        self.header = header
        self.payload = payload
        self.secret = secret

    # 签名
    async def jwt_sign(self):
        bs_header = await hash_tool().get_base64(self.header)
        bs_payload = await hash_tool().get_base64(self.payload)
        s_group = bs_header + b'.' + bs_payload
        return hash_tool().get_sha256(self.secret, s_group)

    async def get_jwt_token(self):
        jwt_res = await hash_tool().get_base64(self.header) + b'.' + await hash_tool().get_base64(
            self.payload) + b'.' + await hash_tool().get_base64(await self.jwt_sign())
        return jwt_res


jwt_header = json.dumps({'alg': 'HS256', 'typ': 'JWT'})
jwt_payload = json.dumps({'exp': time.time() + 7200,  # Expiration Time 此token的过期时间的时间戳
                          'iss': 'couragesteak',  # (Issuer) Claim 指明此token的签发者
                          'iat': time.time(),  # (Issued At) Claim 指明此创建时间的时间戳
                          'data': {
                              'username': 'charles'
                          }
                          })
# 私钥
secret = b"123456"

import asyncio
async def func():
    print("========jwt结果 异步==========")
    j = Util_jwt(header=jwt_header, payload=jwt_payload, secret=secret)
    print(await j.get_jwt_token())
asyncio.run(func())

2.2 jwt包

pip install pyjwt

加密

class hash_tool:

    # 获取base64加密
    async def get_base64(self, data):
    # def get_base64(self, data):

        """
            data: str(字符串)
        """
        # 封装通用base64加密
        return base64.b64encode(data.encode())

    # 获取sha256加密
    async def get_sha256(self, secret, str):
        """
            key: 秘钥串
            str: 原文
        """
        hash = hashlib.sha256(secret)
        hash.update(bytes(str))
        return hash.hexdigest()

异步实现

"""
    jwt生成
"""
import json
import time

from common.util_encryption import hash_tool

class Util_jwt:
    def __init__(self, header, payload, secret):
        self.header = header
        self.payload = payload
        self.secret = secret

    # 签名
    async def jwt_sign(self):
        bs_header = await hash_tool().get_base64(self.header)
        bs_payload = await hash_tool().get_base64(self.payload)
        s_group = bs_header + b'.' + bs_payload
        return hash_tool().get_sha256(self.secret, s_group)
	
	#  获取token
    async def get_jwt_token(self):
        jwt_res = await hash_tool().get_base64(self.header) + b'.' + await hash_tool().get_base64(
            self.payload) + b'.' + await hash_tool().get_base64(await self.jwt_sign())
        return jwt_res

# 私钥
secret = b"123456"
jwt_header = json.dumps({'alg': 'HS256', 'typ': 'JWT'})
jwt_payload = json.dumps({'exp': time.time() + 7200,  # Expiration Time 此token的过期时间的时间戳
                          'iss': 'couragesteak',  # (Issuer) Claim 指明此token的签发者
                          'iat': time.time(),  # (Issued At) Claim 指明此创建时间的时间戳
                          'data': {
                              'username': 'charles'
                          }
                          })

import asyncio

async def func():
    print("========jwt结果 异步==========")
    j = Util_jwt(header=jwt_header, payload=jwt_payload, secret=secret)
    print(await j.get_jwt_token())

asyncio.run(func())

3 校验 jwt

官网校验:https://jwt.io/

在这里插入图片描述

5 js解析jwt

<script src="https://cdn.jsdelivr.net/npm/js-base64@3.7.2/base64.min.js"></script>
function jwt_parse(token) {
	return Base64.atob(token.split(".")[1]);
}
let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJcdTY3MDlcdTUyYzdcdTZjMTRcdTc2ODRcdTcyNWJcdTYzOTIiLCJpYXQiOjE2Njc0NTg5ODAsImV4cCI6MTY2ODA2Mzc4MCwiYXVkIjoid3d3LmNvdXJhZ2VzdGVhay5jb20iLCJkYXRhIjp7InVpZCI6MSwidXNlcm5hbWUiOiJjaGVhcmxlcyJ9fQ.4Xrf3Chpfu1qOnmDy7UQqJAt6dpvKBVxafvr7gdCwdk";
let userinfo = jwt_parse(token)
console.log(userinfo)

结果

{
	"iss": "有勇气的牛排",
	"iat": 1667458980,
	"exp": 1668063780,
	"aud": "www.couragesteak.com",
	"data": {
		"uid": 1,
		"username": "charles"
	}
}

参考地址:
https://blog.csdn.net/weixin_45070175/article/details/118559272

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

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

相关文章

KG-开源项目:CMeKG【利用自然语言处理与文本挖掘技术,基于大规模医学文本数据,以人机结合的方式研发的中文医学知识图谱】

CMeKG&#xff08;Chinese Medical Knowledge Graph&#xff09;是利用自然语言处理与文本挖掘技术&#xff0c;基于大规模医学文本数据&#xff0c;以人机结合的方式研发的中文医学知识图谱。 项目来源&#xff1a; 中文医学知识图谱CMeKG2.0版发布-自然语言处理实验室北京大…

iOS开发之打包上传到App Store——(一)各种证书的理解

OK&#xff0c;有日子没写iOS开发的相关文章啦&#xff0c;主要是最近的精力都没在这上面&#xff0c;不过既然产品已经快要出来了&#xff0c;就有必要了解一下各种证书啥的&#xff08;众所周知iOS的一堆证书可是很让人头大呀&#xff09;&#xff0c;最近确实被这个搞得头大…

外汇天眼:随着美元贬值所有世界货币,每个国家都在为自己着想

没有迹象表明各国政府愿意合作&#xff0c;各国被迫靠自己的力量建立防御措施&#xff0c;抵御万能的美元的无情力量。 在美联储的鹰派政策、美国经济强劲以及寻求市场波动避险的投资者的支持下&#xff0c;美元兑所有其他货币正在稳步走强&#xff0c;创下数十年来的最大涨幅。…

信号发生器不会用?一篇文章教会你

信号发生器是一种能提供各种频率、波形和输出电平电信号的设备。在测量各种电信系统或电信设备的振幅特性、频率特性、传输特性及其它电参数时&#xff0c;以及测量元器件的特性与参数时&#xff0c;用作测试的信号源或激励源。 1、信号发生器如何使用 选用与验电器相同电压等…

Gateway--服务网关

目录一、网关简介二、Gateway简介三、Gateway快速入门基础版增强版简写版四、Gateway核心架构基本概念执行流程五、断言内置路由断言工厂内置路由断言工厂的使用自定义路由断言工厂六、 过滤器局部过滤器内置局部过滤器内置局部过滤器的使用自定义局部过滤器全局过滤器内置全局…

ROS MoveIT2(humble)安装总结

版本 系统版本&#xff1a;ubuntu22.04 ROS2版本&#xff1a;humble Moveit版本&#xff1a;moveit2-humble 安装 ROS 2 和 Colcon 如果您在接下来的几个步骤中遇到错误&#xff0c;一个好的开始是返回并确保您已正确安装 ROS 2。用户通常忘记的一个是获取 ROS 2 安装本身。…

手写Redux(一):实现Redux

在React中&#xff0c;组件和组件之间通过props传递数据的规范&#xff0c;极大地增强了组件之间的耦合性&#xff0c;而context类似全局变量一样&#xff0c;里面的数据能被随意接触就能被随意修改&#xff0c;每个组件都能够改context里面的内容会导致程序的运行不可预料。 …

复习计算机网络——第二章记录(2)

理解一些基本概念&#xff1a; 1、数据&#xff08;data&#xff09;是运送信息的实体。 2、信号&#xff08;signal&#xff09;是数据的电气的或电磁的表现。 3、数据或信号可以是模拟的&#xff0c;也可以是数字的。 4、所谓“模拟的”就是连续变化的。 5、所谓“数字的…

后端微服务项目中出现的问题整理2022年11月

后端微服务项目中出现的问题整理2022年11月后端微服务项目中出现的问题整理2022年11月1.SpringBoot-Mail-Service&#xff08;Spring邮箱服务&#xff09;报错截图解决办法方法一&#xff1a;使用Resource注解方法二&#xff1a;添加(requiredfalse)Resource和Autowired区别2.反…

基于plc的自动洗碗机的设计(西门子)

目 录 摘 要 I Abstract II 1绪论 1 1.1全自动洗碗机的发展 1 1.2全自动洗碗机概述 2 1.2.1 全自动洗碗机的分类 2 1.2.2 全自动洗碗机的基本结构 3 1.2.3 全自动洗碗机的工作原理 4 1.3研究主要内容 4 2 全自动洗碗机机械设计 6 2.1 整体方案设计 6 2.2 各重要部件设计 6 2.2.…

TF-IDF

2.TF - IDF&#xff1a;作用&#xff1a;提取出来一句话中词的重要性&#xff0c;分成两个部分&#xff1a; tf: 词频(某一类中词条出现的次数 / 该类中所有词条数目) idf: 逆文档频率&#xff08;作用&#xff1a;去掉逗号&#xff0c;的等&#xff09;公式&#xff1a;idf l…

【第一阶段:java基础】第8章:面向对象编程高级-2(P394-P423)final、抽象类、接口、内部类

本系列博客是韩顺平老师java基础课的课程笔记&#xff0c;吐血推荐的一套全网最细java教程&#xff0c;获益匪浅 韩顺平java课程 目录&#xff08;P394-P423&#xff09; 1 final 2 抽象类 3 接口 4 内部类 1️⃣ 局部内部类 2️⃣&#x1f353;匿名内部类 3️⃣成员内部类 4️…

C++,顺序结构,选择结构,循环结构

目录 1.选择结构 1.1if语句 1.1.1单行if语句 1.1.2多行格式的if语句 1.1.3多条件if语句 1.1.4嵌套if语句 1.2三目运算符 1.3switch语句 2.循环结构 2.1while循环 2.2do..while语句 2.3for循环语句 2.4嵌套循环 3.跳转语句 3.1.1break 3.1.2continue 3.1.3goto语句 …

UDP-GlcNAc,UDPAG,尿苷二磷酸-N-乙酰基葡萄糖胺,UDP-N-乙酰葡糖胺

产品名称&#xff1a;UDP-GlcNAc 尿苷二磷酸-N-乙酰基葡萄糖胺&#xff0c;UDPAG&#xff0c;UDP-N-乙酰葡糖胺 别 名&#xff1a;5-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐;5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐 英文名&#xff1a;uridine 5-diphospho-N-acetyl-*g…

在家做副业可以做什么,做自媒体应该选择什么平台

今天分享五个&#xff0c;即使你在家里没有收入&#xff0c;自己就可以做的自媒体副业&#xff0c;给自己带来一些收益。 ​ 第一个自媒体副业是公众号&#xff0c;很多人多人都知道。很多人也喜欢看别人写的公众号。 其实微信官方账号注册很简单&#xff0c;不需要花钱有个邮…

Huggingface Transformers各类库介绍(Tokenizer、Pipeline)

目录前言0、transformers的安装以及介绍0-1、 介绍0-2、安装一、分词——transformers.AutoTokenizer1-0、相关参数介绍&#xff08;常用参数介绍&#xff09;1-1、加载、保存1-2、使用以及原理二、黑盒子——transformers.pipeline2-0、pipeline怎么理解&#xff1f;2-1、目前…

SpringCloud:Gateway之限流、熔断

目录 一、服务雪崩简介及压测实践演示 ​编辑 二、sentinel简单模式之流控QPS案例 什么是Sentinel ​ 安装Sentinel控制台 三、sentinel流控简单模式之并发线程数案例 四、sentinel流控之关联模式&链路模式 关联模式 链路模式 五、sentinel降级之平均响应时间&…

Mybatis入门

详细的Mybatis介绍/使用&#xff0c;可以访问&#xff1a; 地址&#xff1a;mybatis – MyBatis 3 | 简介 目录 一、Mybatis介绍 二、依赖 三、什么是rowmapper 四、Mybatis demo 演示 4.1 背景 4.2 JDBC执行sql的流程 &Mybatis 关键要素 4.3 项目的整体结构&…

kubernetes 实战学习

文章目录kubernetes 实战学习1. 资源创建方式2. Namespace3. Pod3.1 使用命令行创建一个 Pod3.2 使用 YAML 文件创建一个 pod3.3 查看 pod 日志3.4 查看 pod IP3.5 进入 pod 查看信息3.6 一个 pod 里同时运行多个容器3.7 pod 和宿主机之间文件拷贝4. Deployment4.1 deployment …

功能测试(一)—— web项目环境与测试流程、业务流程测试

目录 目标 一、web项目环境说明 【了解】 ​编辑 1.1 环境的定义 1.2 环境(服务器)的组成 1.3 面试题&#xff1a;你们公司有几套环境&#xff1f; 二、熟悉商城项目 【了解】 2.1 商城项目的核心业务 2.2 商城项目的核心功能模块 三、测试流程的应用 【重点】 3.1 需…