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的使用

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

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)

相关推荐

  1. Django实现JWT(构成原理base64)

    2024-04-23 09:22:06       34 阅读
  2. js实现base64转字符串

    2024-04-23 09:22:06       40 阅读
  3. uniapp预览base64图片

    2024-04-23 09:22:06       42 阅读
  4. 前端实现base64编码图片的导出

    2024-04-23 09:22:06       165 阅读
  5. 微信小程序实现图片转base64

    2024-04-23 09:22:06       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 09:22:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 09:22:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 09:22:06       87 阅读
  4. Python语言-面向对象

    2024-04-23 09:22:06       96 阅读

热门阅读

  1. kill 端口所属进程

    2024-04-23 09:22:06       29 阅读
  2. 自然语言处理(NLP)技术

    2024-04-23 09:22:06       35 阅读
  3. Android 8.1 删除Launcher桌面搜索框

    2024-04-23 09:22:06       32 阅读
  4. flask后端实践02-全局Response返回和异常处理

    2024-04-23 09:22:06       35 阅读
  5. 全志H616学习笔记

    2024-04-23 09:22:06       36 阅读
  6. 【Python快速上手(一)】

    2024-04-23 09:22:06       34 阅读
  7. 描述一下PHP与HTML和CSS的关系

    2024-04-23 09:22:06       35 阅读
  8. 每天一个数据分析题(二百八十四)

    2024-04-23 09:22:06       35 阅读
  9. 关于抖音 担保支付 订单同步 报错

    2024-04-23 09:22:06       36 阅读
  10. WordPress 谷歌SEO是否还有必要做?又该如何做?

    2024-04-23 09:22:06       36 阅读