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

Django token 认证原理与实战

概述 cookie、session 与token 的区别

Cookie的作用

  1. cookie的存储量很小,一般不超过4K
  2. cookie并不会保存很多信息,一般用来存储登录状态
  3. cookie是以键值对进行表示的(key=value),例如name=li,表示cookie的名字是name,cookie携带的值是li
  4. cookie的存储分为会话存储和持久性存储
  5. 如果cookie会话性那么cookie仅会保存在客户端内存中,当我们关闭客户端时cookie就会失效
  6. 如果cookie为持久性,那么cookie会保存到硬盘中直至生存期结束或者用户主动将其销毁

Session是什么

  1. 在网络应用中成为会话控制
  2. Session用来存储特定用户会话所需的属性及配置等信息
  3. session保存的位置在服务端

为什么需要session

  1. 我们目前使用的互联网应用层协议基本上都是基于HTTP和HTTPS
  2. HTTP和HTTPS是无状态的,只负责请求和响应
  3. 所以导致如果没有额外处理的话服务器是不知道你是谁,更无法根据你是谁给你展现和你相关的内容

cookie存储在客户端,session存储在服务端,浏览器请求时将cookie携带至后端,服务端根据cookie中的关键信息找到对应的session,用来保持会话

什么是token

  • token其实就是一段加密的字符串
  • 一般由身份标识,时间戳,用户必要信息等内容组成
  • tonken的传输就是一个加密和解密的过程

可以看到 服务端是不保存token的
在这里插入图片描述

JWT–JsonWebToken 实现原理

jwt

在这里插入图片描述

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

它是一个由.连接组成的三段字符串

服务端加密的过程

第一段字符串
是头信息,头信息包含算法和算法类型,这部分字符串由头信息进行base64加密得到的,它是token的第一段字符串

第二段字符串
是我们自己定义或者存储的一些信息,可以包含用户名过期时间等,然后对此进行base64加密得到token第二段字符串

第三段字符串

第一段base64加上一个.然后加上第二段base64再加上“密钥”,然后再来一个base64最后生成了token第三段字符串

以上3段字符串通过.进行连接生成最后的token返回给客户端

服务端解密的过程
可以从url中得到用户传递过来的token:requestGET.get(“token”)

第一部分:我们用base64解密得到头信息
第二部分:我们用base64解密得到自己再token中存储的数据
第三部分:把第一个部分加第二部分内容再加上我们自己的密钥进行base64加密得到一个base64字符串,最后用这个字符串和用户传递的第三部分进行比较

DRF-JWT 用户登录认证实现(一)

user/views

class LoginView(GenericAPIView):def post(self,request):return_data = {}request_data = request.dataemail = request_data.get("username")user_data = User.objects.get(email=email)if not user_data:return ResponseMessage.UserResponse.other("用户名或者是密码错误1")else:user_ser = UserSerializer(instance=user_data,many=False)# 用户输入的密码user_password = request_data.get("password")md5_user_password = get_md5(user_password)print(md5_user_password)# 数据库的密码db_user_password = user_ser.data.get("password")print(db_user_password)if md5_user_password != db_user_password:return ResponseMessage.UserResponse.other("用户名或者是密码错误2")else:token_info = {"username":email}token_data = create_token(token_info)return_data["token"] = token_datareturn_data["username"] = user_ser.data.get("name")return ResponseMessage.UserResponse.success(return_data)

user/urls

path("login", LoginView.as_view()),

utils/jwt_auth.py

import datetimeimport jwt
from rest_framework.authentication import BaseAuthenticationfrom muxi_shop_back.settings import SECRET_KEYdef create_token(payload,timeout=1):headers = {'alg':"HS256",'typ':"jwt"}payload["exp"] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)result = jwt.encode(headers=headers,payload=payload,key=SECRET_KEY,algorithm="HS256")return resultdef get_payload(token):result = {"status":False,"data":None,"error":None}try:payload = jwt.decode(token,SECRET_KEY,algorithms=["HS256"])result["status"] = Trueresult["data"] = payloadexcept jwt.exceptions.DecodeError:print("token认证失败了")result["error"] = "token认证失败了"except jwt.exceptions.ExpiredSignatureError:print("token已经失效了")result["error"] = "token已经失效了"except jwt.exceptions.InvalidTokenError:print("无效的、非法的token")result["error"] = "无效的、非法的token"return result# 用户在url中进行token的参数配置
class JwtQueryParamAuthentication(BaseAuthentication):def authenticate(self, request):# 从url中拿到tokentoken = request.GET.get("token")result_payload = get_payload(token)print(result_payload)return (result_payload,token)class JwtHeaderAuthentication(BaseAuthentication):def authenticate(self, request):# 从头信息中拿到tokentoken = request.META.get("HTTP_TOKEN")print(token)result_payload = get_payload(token)print(result_payload)return (result_payload,token)

测试一下 比如执行某个类下面的方法之前都会先获取token,验证其是否失效
这里验证地址列表,通过url传递token
在这里插入图片描述
先登录获取token
在这里插入图片描述
获取地址列表
在这里插入图片描述

同时终端也打印了信息,说明方法被调用了
utils/jwt_auth.py
在这里插入图片描述

在这里插入图片描述

再次请求token就失效了,所以我们可以request.user.get(“status”) 判断用户登录状态是否失效
在这里插入图片描述

address/views

把定义的验证类加在该方法下,表明访问即验证token

class AddressListGenericAPIView(GenericAPIView,ListModelMixin):queryset = UserAddress.objectsserializer_class = AddressSerializerauthentication_classes = [JwtQueryParamAuthentication, ]def get(self, request):# 拿到token验证返回的第一个值print(request.user)# 拿到token返回的第二个值print(request.auth)# 加该逻辑即进行验证if not request.user.get("status"):return JsonResponse(request.user, safe=False)return self.list(request)

DRF-JWT 头信息传递的token验证
utils/jwt_auth.py

class JwtHeaderAuthentication(BaseAuthentication):def authenticate(self, request):# 从头信息中拿到tokentoken = request.META.get("HTTP_TOKEN")print(token)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

DRF-JWT-Token 的全局配置

settings


# 全局的token验证配置
REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES":['utils.jwt_auth.JwtQueryParamAuthentication']
}

测试
只需要加这两行代码就行
在这里插入图片描述
在这里插入图片描述

不加的不影响
在这里插入图片描述

相关文章:

Django token 认证原理与实战

概述 cookie、session 与token 的区别 Cookie的作用 cookie的存储量很小,一般不超过4Kcookie并不会保存很多信息,一般用来存储登录状态cookie是以键值对进行表示的(keyvalue),例如nameli,表示cookie的名字是name,cookie携带的值是licookie的存储分为会…...

JVM虚拟机:Java对象的头信息有什么?

本文重点 在前面的课程中,我们学习了对象头,其中对象头包含Mark Word和class pointer,当然数组还会有一个数组长度。本文主要分析Mark Work中包含的信息。 Mark Word 以下两张图是一个意思: 32位 32位 64位 以上就是Mark Word会存储的信息,这个意思是说Java对象在不同…...

场效应管器件

在面试硬件方面的工作时,我们通常会被提问模电方面的知识。 场效应管简称FET,有三级:源极(S)、漏极(D)、栅极(G);可以实现电压控制电流源;“源极和漏极之间的漏极电流Id,由栅极的负电压进行控制…...

javascript之for循环介绍

javascript之for循环介绍 1)语法: for ([initialization]; [condition]; [final-expression]) { // code to be executed }1)initialization(初始化):在循环开始之前执行,通常用于设置循环计…...

【机器学习可解释性】3.部分依赖图

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP Value5.SHAP Value 高级使用 正文 每个特征怎么样影响预测结果? 部分依赖图 Partial Dependence Plots 虽然特征重要性显示了哪些变量对预测影响最大,但部分依赖图显示了特征如…...

在CARLA中手动开车,添加双目相机stereo camera,激光雷达Lidar

CARLA的使用逻辑: 首先创建客户端 设置如果2秒没有从服务器返回任何内容,则终止 client carla.Client("127.0.0.1", 2000) client.set_timeout(2.0) 从客户端中get world world client.get_world() 设置setting并应用 这里使用固定时…...

【VUE】ArcoDesign之自定义主题样式和命名空间

前言 Arco Design是什么? Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址:https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案:Arco Design Pro(https://pro.arco.design/) Arco De…...

TVRNet网络PyTorch实现

文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集(Actual Road dense image Dataset, ARD),通过专业的能见度计和多人标注,获得…...

opencv之坑(八)——putText中文乱码解决

opencv4.0之前版本和部分4.0版本的putText仅支持英文&#xff0c;如果中文会乱码&#xff0c;可以用下面方法构造函数解决&#xff1a; 头文件如下&#xff1a; #pragma once #ifndef PUTTEXT_H_ #define PUTTEXT_H_#include <windows.h> #include <string> #incl…...

nrf52832 开发板入手笔记:资料搜集

前言 最近翻箱&#xff0c;发现了两块几年前买的 NRF52832 与 NRF52840 的开发板&#xff0c;打算搭个 BLE 的开发环境 NRF52832 与 NRF51822 之前用过&#xff0c; NRF52840 没有用过&#xff0c;好像是 BLE4 与 BLE5 的区别吧 相关介绍 除了开发板&#xff0c;最重要的还是…...

PHP如何批量修改二维数组中值

每个name值加pex&#xff0c;age加5&#xff0c; 原数据&#xff1a; $data[["name">a,age>12],["name">b,age>22],["name">c,age>33],["name">d,age>44], ];实现效果 方案一、foreach引用方式 $data[["…...

Python 算法高级篇:归并排序的优化与外部排序

Python 算法高级篇&#xff1a;归并排序的优化与外部排序 引言 1. 归并排序的基本原理2. 归并排序的优化2.1 自底向上的归并排序2.2 最后优化 3. 外部排序4. 性能比较5. 结论 引言 在计算机科学中&#xff0c;排序是一项基本的任务&#xff0c;而归并排序&#xff08; Merge S…...

LeetCode--1991.找到数组的中间位置

1 题目描述 给你一个下标从 0 开始的整数数组 nums , 请你找到 最左边 的中间位置 middleIndex &#xff08;也就是所有可能中间位置下标最小的一个&#xff09; 中间位置 middleIndex 是满足 nums[0] nums[1] ... nums[middleIndex-1] nums[middleIndex1] nums[middleI…...

物联网数据采集网关连接设备与云平台的关键桥梁

随着工业4.0和智能制造的快速发展&#xff0c;物联网数据采集网关在工业物联网中的应用越来越广泛。物联网数据采集网关作为连接设备与云端之间的关键桥梁&#xff0c;能够实现高效、可靠、安全的数据传输和转换&#xff0c;为智能制造和工业4.0提供了强大的支持。 一、物联网…...

专家级数据恢复:UFS Explorer Professional Recovery Crack

UFS Explorer Professional Recovery - 一款功能强大且方便的数据恢复程序&#xff0c;支持检测大量文件系统、操作系统和各种类型的驱动器&#xff1a;从简单的闪存驱动器到复杂的复合存储&#xff08;各种级别的 RAID 阵列&#xff09;。 该程序由执业专家开发&#xff0c;并…...

2023/10/23 mysql学习

数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…...

软考系统架构师知识点集锦六:项目管理

一、考情分析 二、考点精讲 2.1进度管理(时间管理) 进度管理:为了确保项目按期完成所需要的管理过程。 2.1.1过程 [WBS分解的基本要求] WBS的工作包是可控和可管理的&#xff0c;不能过于复杂。任务分解也不能过细&#xff0c;一般原则WBS的树形结构不超过6层。每个工作包要…...

MacOS系统Chrome开发者模式下载在线视频

操作流程 # step1. 进入开发者模式 command option i # step2. 在搜索栏中搜索 getHttpVideoInfo.do?关键词 # step3. 在Preview的Json界面中找到video&#xff0c;然后选择不同resolution & duration的视频片段&#xff1b; # step4. 选择合适的video::chapters, 选择…...

uniapp v3+ts 使用 u-upload上传图片以及视频

上传图片方法 <u-upload :fileList"fileList1" afterRead"afterRead" delete"deletePic" name"file" multiple :maxCount"6"></u-upload> // maxCount 最大上传数const fileList1 ref([]);const file ref([…...

为什么虚拟dom会提高性能?

虚拟 DOM&#xff08;Virtual DOM&#xff09;是一种在前端开发中常用的技术&#xff0c;它可以提高性能并改善用户体验。虚拟 DOM 的原理和用处如下&#xff1a; 原理&#xff1a; 当页面状态发生变化时&#xff0c;虚拟 DOM 会以 JavaScript 对象的形式进行更新&#xff0c;而…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...