Django中实现JWT(构成原理、base64)

Django中实现JWT(构成原理、base64)

目录

简介

JWT (JSON Web Token)通常用于对用户进行身份验证和授权,是一种无状态的认证机制,通过在用户和服务器之间传递加密的令牌来验证用户身份

  • 区别于之前的cookie和session
  • 签发阶段:登陆成功后签发token,将token存储到客户端的cookies中
  • 认证阶段:从请求中拿到token,利用token签发的逆运算解析token得到user对象并存储到request.user中,然后才能在后端进行使用

JWT的构成原理

JWT是由字符串构成的,分为三段文本信息

  • 第一段:header头部,一般存放公司信息、加密方式、声明这是JWT,这些一般都是固定的
  • 第二段:payload载荷,一般存放登录用户的信息:用户名、密码、id、过期时间、签发时间、是否为超级用户、jwt唯一身份标识
  • 第三段:将头和载荷的信息通过某种方式加密(md5、sha1、HS256)得到,并在其中加入盐

每一段都用base64编码,注:base64不是一种加密方式,而是编码方式

base64的使用

python 复制代码
import json
import base64

userinfo = {'user': '张三', 'age': 18}
userinfo_str = json.dumps(userinfo)

# 编码成base64
res = base64.b64encode(userinfo_str.encode(encoding='utf-8'))
print(res)
# b'eyJ1c2VyIjogIlx1NWYyMFx1NGUwOSIsICJhZ2UiOiAxOH0='

# 将base64解码
res = base64.b64decode(res)
print(res)
# b'{"user": "\\u5f20\\u4e09", "age": 18}'

手动验证token

python 复制代码
from datetime import datetime
import json
import base64
import hashlib


class MyJWT:
    def __init__(self, header=None, payload=None, token=None):
        self.header = header
        self.payload = payload
        self.token = token

    def get_base64(self, info):
        return base64.b64encode((json.dumps(info)).encode(encoding='utf-8'))

    def get_md5(self, header, payload):
        md5 = hashlib.md5()
        md5.update(header)
        md5.update(payload)
        md5.update(b'7777')  # 盐
        return md5.hexdigest()

    def get_token(self, header, payload):
        base64_header = self.get_base64(header)
        base64_payload = self.get_base64(payload)
        token = f'{base64_header.decode(encoding="utf8")}.{base64_payload.decode(encoding="utf8")}.{self.get_md5(base64_header, base64_payload)}'
        return token

    def check_token(self, token):
        base64_header, base64_payload, sign = token.split('.')
        token = self.get_md5(base64_header.encode('utf8'), base64_payload.encode('utf8'))

        if sign == token:
            return True
        else:
            return False

    def Issuance(self):
        token = self.get_token(self.header, self.payload)
        return token

    def Validate(self, token):
        if self.check_token(token):
            return True
        else:
            return False


headers = {'type': 'jwt', 'alg': 'md5'}
userinfo = {'name': '张三', 'age': 18, 'time_field': str(datetime(2024, 1, 1, 12, 0)), 'time_expires': str(
    datetime(2024, 1, 2, 12, 0)), 'level': 1}
jwt = MyJWT(header=headers, payload=userinfo)
Token = jwt.Issuance()
Token_validate = jwt.Validate(Token)
相关推荐
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai2 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚9 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队9 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
再吃一根胡萝卜9 小时前
使用 squashmigrations 命令优化 Django 迁移文件
python·django