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']
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/170366.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebSocket 入门案例

目录 WebSocket入门案例WebSocket-server新增项目:添加依赖:yml:启动类: frontend-server前端项目:添加依赖:添加yml:启动类:前端引入JS:前端页面:后端代码:测试: WebSocket 入门案…

一句话解释什么是出口IP

出口 IP 是指从本地网络连接到公共互联网时所使用的 IP 地址。这个 IP 地址是由 Internet 服务提供商(ISP)分配给你的,它可以用来标识你的网络流量的来源。如果你使用的是 NAT(网络地址转换)技术,则在 NAT 设备内部会进行地址转换,使得多个设备可以共享同一个公共 IP 地…

在Mac上使用安卓桌面模式

在安装Homeblew的基础上 替换国内源 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" brew update 安装Scrcpy …

DC/DC升压模块电源 高电压稳压输出 12v24v28v48v转600V800V1000V1100V1300V1500V2000V3000V4000V

特点 ● 效率高达 80% ● 2*2 英寸标准封装 ● 单电压输出 ● 价格低 ● 稳压输出 ● 工作温度: -40℃~85℃ ● 阻燃封装,满足UL94-V0 要求 ● 温度特性好 ● 可直接焊在PCB 上 应用 HRA(B) 0.1~30W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为…

conda虚拟环境配置

命令行输入,conda -V 确定conda版本 创建自己的conda虚拟环境 activate 回车 conda create -n 名字 python版本号 执行命令 确认执行命令 输入y 创建完成 激活环境 conda activate 名字 进入python环境 python 退出 exit() conda deactive

Redis -- 基础知识2

1.Redis客户端介绍 1.基础介绍 Redis是一种客户端-服务器结构的程序,通过网络进行互动 客户端的多种形态 1.自带了命令行客户端:redis-cil 2.图形化界面的客户端:依赖windows系统,连接服务器有诸多限制,不建议使用 3.基…

gRPC之gateway集成swagger

1、gateway集成swagger 1、为了简化实战过程,gRPC-Gateway暴露的服务并未使用https,而是http,但是swagger-ui提供的调用服 务却是https的,因此要在proto文件中指定swagger以http调用服务,指定的时候会用到文件 prot…

CV计算机视觉每日开源代码Paper with code速览-2023.10.23

精华置顶 墙裂推荐!小白如何1个月系统学习CV核心知识:链接 点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Zone Evaluation: Revealing Spatial Bias i…

Python使用psycopg2读取PostgreSQL的geometry字段出现二进制乱码

1、问题 读取geometry字段出现二进制乱码 查询语句: sql "select * from public"Note: 这种写法在PostgreSQL中直接查询, 没有问题,不会报错。 但是在Python中查询,如果导出的geom还是一长串的geometry 格式的话, …

招商平台小程序开发制作方案

招商平台小程序旨在为企业提供一个便捷、高效的招商信息发布和合作伙伴寻找的平台。通过整合企业资源,打造一个集信息发布、信息筛选、在线沟通、合作洽谈等功能于一体的综合性招商服务平台。 一、招商平台小程序的用户需求 1. 企业用户:需要一个便捷的…

ELK概述部署和Filebeat 分布式日志管理平台部署

ELK概述部署、Filebeat 分布式日志管理平台部署 一、ELK 简介二、ELK部署2.1、部署准备2.2、优化elasticsearch用户拥有的内存权限2.3、启动elasticsearch是否成功开启2.4、浏览器查看节点信息2.5、安装 Elasticsearch-head 插件2.6、ELK Logstash 部署(在 Apache 节…

Pytorch使用torchvision.datasets.ImageFolder读取数据集,数据集的内容排列状况

当使用torchvision.datasets.ImageFolder读取猫狗数据集时,dataset中存的图片是 猫狗猫狗猫狗猫狗 还是 猫猫猫猫狗狗狗狗 呢? 数据集文件的存放路径如下图 测试代码如下 import torch import torchvisiontransform torchvision.transforms.Compose([torchvision.transform…

【AI视野·今日Robot 机器人论文速览 第五十七期】Wed, 18 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 18 Oct 2023 Totally 17 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Underwater and Surface Aquatic Locomotion of Soft Biomimetic Robot Based on Bending Rolled Dielectric Elastomer Actua…

Tomcat 和 HTTP 协议

目 录 HTTP 协议HTTP 是什么理解 HTTP 协议的工作过程抓包结果HTTP请求HTTP响应 HTTP 请求 (Request)认识 URL认识 "方法" (method)认识请求 "报头"(header)认识请求 "正文" (body) HTTP 响应认识 "状态码" (st…

【STM32】时钟设置函数(寄存器版)

一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振(HSI) 内部晶振不稳定,当我们上电后,会自动产生振动,自动产生时钟,…

代碼隨想錄算法訓練營|第四十五天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零。刷题心得(c++)

目录 讀題 1049. 最后一块石头的重量 II 自己看到题目的第一想法 看完代码随想录之后的想法 494. 目标和 自己看到题目的第一想法 看完代码随想录之后的想法 474.一和零 自己看到题目的第一想法 看完代码随想录之后的想法 1049. 最后一块石头的重量 II - 實作 思路 …

6. Cesium中的Entity

1. Entity类简介 Entity类是Cesium中描述和呈现地球上实体对象的核心类。它具有丰富的属性和方法,用于控制和定制地理实体的外观和行为。Entity对象可以表示各种地理实体,如点、线、面等,并具有位置、方向、模型、标牌、折线、多边形等属性&…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目,最近研究了怎么部署Spring Boot项目,至此,一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目,所以构建没有使用docker容器,直接用java -jar命令…

【Axure高保真原型】图片手电筒效果

今天和大家分享图片手电筒效果的原型模板,鼠标移入图片区域后,会显示一个光圈,光圈会跟随鼠标移动,照亮对应的区域;鼠标拖动时可以移动地图图片,查看更多区域的内容,具体效果可以打开下方原型地…

app开发者提升第四季度广告收入的方法

第四季度将迎来双十一、双十二、圣诞、元旦为主的电商购物季,这是一年中利用线上消费为全新年度和全新预算做好准备的最佳时机,从过往的变现成功案例中汇总了优化要点,帮助开发者在第四季度和未来一年获取更多广告收益。 https://www.shensh…