当前位置: 首页 > article >正文

Django token 生成与验证

首先创建一个Django 项目,我这里以 demo为例,作为示例先不创建app了

 然后再 demo 目录下创建 views.py 和 utils 目录,在目录下分别创建 token.py ,middleware.py ,__init__.py,然后目录格式如下图

接下来完成views.py 和 token.py 和 middleware.py 中的内容了,首先是 token.py

import time
import hashlib
from demo import settings
from django.core import signing
from datetime import datetime, timedelta

HEADER = {'typ': 'JWP', 'alg': 'default'}
KEY = settings.SECRET_KEY
SALT = "ESS"

def encrypt(obj):
    """加密: signing 加密 and Base64 编码"""
    value = signing.dumps(obj, key=KEY, salt=SALT)
    value = signing.b64_encode(value.encode()).decode()
    return value

def decrypt(src):
    """解密: Base64 解码 and signing 解密"""
    src = signing.b64_decode(src.encode()).decode()
    raw = signing.loads(src, key=KEY, salt=SALT)
    return raw

def create_token(username):
    """生成token信息"""
    # 1. 加密头信息
    header = encrypt(HEADER)
    # 2. 构造Payload(有效期31天)
    payload = {
        "username": username, 
        "iat": time.time(), 
        "exp": (datetime.utcnow() + timedelta(hours=8,days=31)).strftime("%Y-%m-%d")
        }
    payload = encrypt(payload)
    # 3. MD5 生成签名
    md5 = hashlib.md5()
    md5.update(("%s.%s" % (header, payload)).encode())
    signature = md5.hexdigest()
    token = "%s.%s.%s" % (header, payload, signature)
    return token

def get_payload(token):
    """解析 token 获取 payload 数据"""
    payload = str(token).split('.')[1]
    payload = decrypt(payload)
    return payload

def get_username(token):
    """解析 token 获取 username"""
    payload = get_payload(token)
    return payload['username']

def get_exp_time(token):
    """解析 token 获取过期时间"""
    payload = get_payload(token)
    return payload['exp']

def check_token(username, token):
    """验证 token: 检查 username 和 token 是否一致且未过期"""
    return get_username(token) == username and get_exp_time(token) > (datetime.utcnow() + timedelta(hours=8)).strftime('%Y-%m-%d')

接着是 middleware.py 文件,记得配置 路由白名单,即不需要验证 token 的路由

from .token import check_token
from django.http import JsonResponse

try:
    from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x
except ImportError:
    MiddlewareMixin = object

# 白名单,表示请求里面的路由时不验证登录信息
API_WHITELIST = ['/index/', '/index', 'index/']


class AuthorizeMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print(request.path)
        print(request.path not in API_WHITELIST)
        if request.path not in API_WHITELIST:
            if "sites" in request.path:
                pass
            else:
                # 从请求头中获取 username 和 token
                username = request.META.get("HTTP_USERNAME")
                token = request.META.get("HTTP_AUTHORIZATION")
                if username is None or token is None:
                    return JsonResponse({"code": -2, "msg": "未查询到登录信息"})
                else:
                    # 调用 check_token 函数验证
                    if check_token(username, token):
                        pass
                    else:
                        return JsonResponse({"code": -2, "msg": "登录信息错误或已过期"})

接着是 views.py

from django.http import JsonResponse
from demo.utils.token import create_token

def index(request):
    return JsonResponse({'code': 0, 'message': 'Hello, world!'})

 接着是 url.py,需要设置一下请求路径

from django.urls import path
from demo import views

urlpatterns = [
    path('index/', views.index),
]

接着再 settings.py 文件中 设置我们的中间件,这样每次请求都会先校验 token 了

MIDDLEWARE = [
    'demo.utils.middleware.AuthorizeMiddleware', # 一定要放在最上面,有cors的话放cors下面
    '···',
]

 到这为止 就已经完成了所有的配置,下面图1 和图2分别是 设置和没设置请求路径白名单的效果

图1 - 没有设置路由白名单

图2 - 设置了路由白名单

http://www.kler.cn/a/399802.html

相关文章:

  • DQN系列算法详解
  • <项目代码>YOLOv8 番茄识别<目标检测>
  • 场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值
  • C++11(四)---可变参数模板
  • AI大模型如何重塑软件开发流程:智能化与自动化的新时代
  • linux笔记(防火墙)
  • 速盾:CDN服务器和双线服务器哪个更好?
  • 如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示
  • ReactPress vs VuePress vs RectPress
  • 如何将 Anaconda 源切换到国内镜像以提高下载速度:详细教程 ubuntu20.04 Pytorch
  • Springboot基于GIS的旅游信息管理系统
  • wps PPT debug
  • 动手学深度学习10.2. 注意力汇聚:Nadaraya-Watson 核回归-笔记练习(PyTorch)
  • 【118页word下载】新型智慧城市顶层设计方案
  • Node.js 23 发布了!
  • 深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
  • 思科考证多少钱?不同级别思科认证考试费用详解!
  • 6.C操作符详解,深入探索操作符与字符串处理
  • 训练误差or测试误差与特征个数之间的关系--基于R语言实现
  • 性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告
  • Java项目实战II基于Java+Spring Boot+MySQL的新闻稿件管理系统(源码+数据库+文档)
  • 使用IDE实现java端远程调试功能
  • HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案
  • 【杂谈】无人机测绘技术知识
  • PyTorch 中使用自动求导计算梯度
  • 【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)