JWT详细介绍
创始人
2024-03-08 22:51:52
0

文章目录

    • 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 timefrom common.util_encryption import hash_toolclass Util_jwt:def __init__(self, header, payload, secret):self.header = headerself.payload = payloadself.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_payloadreturn 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_resjwt_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 timefrom common.util_encryption import hash_toolclass Util_jwt:def __init__(self, header, payload, secret):self.header = headerself.payload = payloadself.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_payloadreturn hash_tool().get_sha256(self.secret, s_group)#  获取tokenasync 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 asyncioasync 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


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

相关内容

热门资讯

新疆火炬(603080)披露公... 截至2025年12月22日收盘,新疆火炬(603080)报收于22.81元,较前一交易日上涨0.35...
原创 “... 福州一轿车在街头逆行,连撞多辆非机动车致5人受伤。警方通报称系“操作不当”,排除酒驾毒驾。但“操作不...
多个岗位招聘限男性当地人社部门... 多个岗位招聘限男性当地人社部门被起诉:怠于履行监管职责
痛惜!年仅40岁!80后法官调... 12月22日,据宁夏日报消息,西吉县人民法院综合审判庭副庭长马春刚,在调解纠纷时突发心脏病倒在办公桌...
天玑科技:因涉嫌串标,公司及相... 12月22日,天玑科技(300245.SZ)发布公告称,公司近日收到上海市虹口区人民检察院送达的《起...
交建股份实际控制人因涉嫌犯罪被... 12月22日晚,交建股份公告,公司实际控制人俞发祥因涉嫌犯罪被绍兴市公安局采取刑事强制措施,案件正在...
涉嫌串通投标,这家上市公司被起... 12月22日,天玑科技(300245.SZ)公告称,公司于近日收到上海市虹口区人民检察院送达的《起诉...
40项试点经验及实践案例入围广... 中新网南宁12月22日电(林浩)广西壮族自治区商务厅22日介绍,中国(广西)自由贸易试验区第七批自治...
突发!祥源文旅董事长俞发祥涉嫌... 【大河财立方消息】12月22日,浙江祥源文旅股份有限公司(证券简称:祥源文旅)公告,收到公司实际控制...
祥源文旅:实控人俞发祥因涉嫌犯... 祥源文旅12月22日晚间公告,公司实际控制人俞发祥因涉嫌犯罪被绍兴市公安局采取刑事强制措施,案件正在...