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.mzph.cn/news/117845.shtml

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

相关文章

蓝桥杯双周赛算法心得——摆玩具(分段的差不计入结果)

大家好,我是晴天学长,这是一道可以牢记的数学技巧题。 1) .摆玩具 2) .算法思路 1.创建一个Scanner对象以从用户读取输入。 2.从用户读取n和k的值,分别表示数组的大小和k的值。 3.创建一个大小为n的整数数组a,用于存储输入的数…

这两天的一些碎碎念

一直以来我都不算是一个非常热爱运维岗位的一个人,其实本行工作对于我来说只是一个工作。运维的广度很大,说什么工作了7年了,可最终总感觉还曾是一窍不通。 什么shell啊,什么python啊,什么大数据啊,7年里&a…

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站, 本篇音乐播放器功能完善:顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…

uniapp开发小程序—根据生日日期计算年龄 周岁

0、需求 在UniApp开发小程序中,将接口返回的出生日期转化为年龄;判断接口返回的年龄是否是周岁 可以使用JavaScript的日期处理方法来实现。 一、第一种方式(示例代码): //javascript // 假设接口返回的年龄为生日的…

TCP通信实战案例-即时通信

即时通信是什么含义,要实现怎么样的设计? 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到。 即时通信需要进行端口转发的设计思想。 服务端需要把在线的Socket管道存储起来。 一旦收到一个消息要推送给其他管道。…

Json字符串转换小工具

下载【免费】Json字符串格式化和压缩,支持数组元素的不换行且能转换成16进制资源-CSDN文库 推荐理由: 离线使用支持json字符串的数据格式化和压缩,如:图1支持数组元素的16进制转换,如:图2支持数组元素不换…

小主机折腾记18

这个月冲动消费了小两千块钱…… 1.880g5twr 由于四根2400t的内存条没有用出去,我又把它们装回了惠普的800g5twr; 看到pdd有400块钱的9350K,于是想着给他上一个9350k 在参考了pdd、咸鱼以及淘宝的价格后,我发现400块钱的9350k都…

Autojs 利用OpenCV识别棋子之天天象棋你马没了

本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置 通过autojs脚本实现自动点击棋子 开源地址 https://github.com/Liberations/TtxqYourHorseIsGone/blob/master/main.js AutoXJs https://github.com/kkevsekk1/AutoX/releasesauto() //安卓版本高于Android 9…

第十二届蓝桥杯模拟赛第二期

A填空题 问题描述 请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍。 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的…

update:将另一表里查询的数据,拼接赋值

在公司业务里,需要在存储过程里,更新操作:将另一表里查询的数据,拼接赋值 UPDATE aSET a.cdescription申请于b.dneed前采购CONVERT(VARCHAR(10),icount)种物品FROM op_engorder_e_spe a,(SELECT COUNT(1) icount,MAX(CONVERT(VARC…

Plex踩坑——plex web无法找到媒体服务器

现象:之前安装过plex server,然后卸载了。再次重装后,plex web无法找到媒体服务器。 原因:卸载plex server时需要手动将plex的注册表删除:HKEY_CURRENT_USER\Software\Plex, Inc. 原文链接Uninstall Plex Media Serve…

前端html生成PDF

需要用到的组件 1、html2canvas 地址:http://html2canvas.hertzen.com/ 安装:npm install --save html2canvas 2、jsPDF 地址:https://github.com/parallax/jsPDF 安装:npm install jspdf --save 代码 // 导出页面为PDF格式 im…

es: java->count统计、distinct去重

1 统计count GET /indexname/_count {"query": {"range": {"dataTime": {"from": "2023-01-22","to": null,"include_lower": true,"include_upper": true,"format": "yyyy-…

wf-docker集群搭建(未完结)

系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、redis集群二、mysql集群三、nacos集群1. 环境要求2. 拉取镜像2.1. 拉取镜像方式配置集群2.2. 自定义nacos镜像配置集群 3 自定义…

C语言 sizeof 函数内部进行计算

直接看代码 #include <stdio.h> int main() {int i 2;int j;j sizeof(i i);printf("i %d, j %d", i ,j);return 0; }执行结果&#xff1a; 可以看到 i的值一直是没有变的&#xff0c; j 是int类型下 sizeof占用的大小为 4个字节&#xff0c;不是i的 22…

Leetcode456. 132 Pattern

给定一个 n n n个元素的数组 132模式&#xff0c;就是找到 n u m s [ i ] , n u m s [ j ] , n u m s [ k ] nums[i], nums[j], nums[k] nums[i],nums[j],nums[k],满足 i < j < k , n u m s [ i ] < n u m s [ k ] < n u m s [ j ] i < j < k, nums[i] < …

NewStarCTF2023week4-More Fast(GC回收)

打开链接&#xff0c;存在很多个类&#xff0c;很明显是php反序列化漏洞利用&#xff0c;需要构造pop链 &#xff0c; 关于pop链构造的详细步骤教学&#xff0c;请参考我之前的博客&#xff0c;真的讲得很详细也容易理解&#xff1a; http://t.csdnimg.cn/wMYNB 如果你是刚接…

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

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

宏电5G RedCap工业智能网关获首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日&#xff0c;2023世界物联网博览会——中国移动物联网开发者大会暨物联网产业论坛在无锡圆满举行。宏电股份参与中国移动5G物联网开放实验室5G及轻量化产品能力认证成果授牌仪式&#xff0c;并获得认证证书。 此次认证主要对产品功能、产品性能、RedCap网络兼容性进行测…

sw型材利用父子关系找最新特征

利用父子关系可以找到设计树最新的编辑