drf jwt 原理,cookie,session,token base64

news/2024/4/30 19:08:08/文章来源:https://blog.csdn.net/weixin_71967396/article/details/127290955

drf jwt 原理,cookie,session,token base64

文章目录

  • drf jwt 原理,cookie,session,token base64
    • 1、cookie,session,token介绍
    • 2、jwt 原理介绍
    • 3、 base64编码和解码
    • 4、drf-jwt快速使用
    • 5、drf-jwt 修改返回格式
      • 5.1、使用步骤
    • 6、自定义user表,签发token
    • 作业

1、cookie,session,token介绍

摘自

token:三段式
第一段:头:公司信息,加密方式
第二段:荷载:真正的数据{name:ming,id:1}
第三段:签名,通过第一段和第二段,通过某种加密方式加密得到 字符码

token的使用分两个阶段
登录成功后的【签发token阶段】—>生成三段
登录成功访问某个接口的 【验证阶段】—>验证token是否合法

cookie是:存在客户端浏览器的键值对
session是:存在于服务端键值对
token是:三段式,服务端生成的,存放在客户端(浏览器就放在cookie中,移动端:存在移动端中)

使用token的认证机制,服务端还要存数据吗?token是服务的生成,客户端保存,服务的不存储token
img

img

2、jwt 原理介绍

Json web token (JWT),token的应用于web方向的称之为jwt

构成和工作原理
Jwt 就是一段字符串,由三段信息构成的,将三段信息文本用,链接一起就构成了jwt字符串。就像这个样eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

header:头

声明类型,这里是jwt
声明加密的算法:通常直接使用 HMAC SHA256
公司信息

{'typ': 'JWT','alg': 'HS256'
}

变成了(base64的编码)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload:荷载
exp:jwt的过期时间,这个过期时间必须要大于签发时间
iat:jwt的签发时间
用户信息:用户信息

{"exp": "1234567890","name": "John Doe","userid": 3}

变成了(base64的编码)
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
signature: 签名
把头和荷载加密后得到的:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意:secret是保存在服务器端的(加密方式+盐),jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

jwt 使用流程最核心的是:
签发:登录接口签发
认证:认证类认证

3、 base64编码和解码

base64 可以把字符串编码成base64的编码格式:(大写字母,数字和=)
eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogImxxeiIsICJhZG1pbiI6IHRydWV9
base64 可以把base64 编码的字符串,解码回原来的格式
应用场景:
jwt中使用
网络中传输字符串就可以使用base64编码
网络中传输图片,也可能使用base64的编码

编码解码

import json
import base64
d = {'name': 'lqz', 'userid': 6, 'age': 19}
info = json.dumps(d)
print(info)
# 把字符串使用base64编码
res=base64.b64encode(info.encode('utf-8'))
print(res)  # eyJuYW1lIjogImxxeiIsICJ1c2VyaWQiOiA2LCAiYWdlIjogMTl9res=base64.b64decode(s)
with open('code.png','wb') as f:f.write(res)

4、drf-jwt快速使用

jwt:签发(登录接口)认证(认证类)
django中使用jwt
可以自己写

https://github.com/jpadilla/django-rest-framework-jwt(比较老)
https://github.com/jazzband/djangorestframework-simplejwt (比较新

安装
pip3 install djangorestframework-jwt

快速使用

  1. 迁移表,因为它默认使用auth的user表签发token

  2. 创建超级用户(auth的user表中要有记录)

  3. 咱们不需要写登录接口了,如果是使用auth的user表作为用户表,它可以快速蒸发

  4. 签发(登录):只需要咋路由中配置(因为它邦咱们写好登录接口了)

    from rest_framework_jwt.views import obtain_jwt_token
    urlpatterns = [path('login/',obtain_jwt_token),
    ]
    

    认证(认证类):导入,配置在视图上

    class TestView(APIView):authentication_classes = [JSONWebTokenAuthentication,]permission_classes = [IsAuthenticated,]
    

前端访问时,token需要放在请求头中
Authorization:jwt token串

5、drf-jwt 修改返回格式

登录成功后,前端看到格式,太固定了,只有token,我们想做成

{code:100,msg:'登录成功',token:adfasdfasdf}

固定写法:写一个函数,函数返回什么,前端就看到什么,配置在配置文件中

5.1、使用步骤

写一个函数

def jwt_response_payload_handler(token, user=None, request=None):return {'code':100,'msg':'登录成功','username':user.username,'token':token}

把函数配置在配置文件中

JWT_AUTH={'JWT_RESPONSE_PAYLOAD_HANDLER':'app01.jwt_response.jwt_response_payload_handler'
}

以后登录接口返回的格式就是咱们写的函数的返回值

6、自定义user表,签发token

自己写 userinfo表

class User(models.Model):username = models.CharField(max_length=32)password = models.CharField(max_length=32)

写一个登录接口

from rest_framework.exceptions import APIException
from app01.models import User
from rest_framework_jwt.settings import api_settingsjwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
class UserView(APIView):def post(self,request):username =request.data.get('username')password = request.data.get('password')try:user=User.objects.get(username=username,password=password)#根据user,签发token>>>三部分:头,荷载,签名# 使用djagnorestframework-jwt模块提供的签发token的函数,生成token# 通过user对象---》{username:lqz,id:1,过期时间}payload = jwt_payload_handler(user)# 根据payload---》得到token:头.荷载.签名token = jwt_encode_handler(payload)return Response({'code':100,'msg':'登录成功','token':token})except :raise APIException('用户名或密码错误')

作业

  1. 快速签发

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcvSrgSV-1665580438919)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012150133658.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x7rCQH0y-1665580438920)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012150207601.png)]

  2. 修改登录返回格式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EysNJFVo-1665580438920)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012151424424.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tj8oRy1P-1665580438921)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012151508271.png)]

  3. 自定义用户表签发token

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwSN2bus-1665580438921)(C:\Users\82576\AppData\Ro
    aming\Typora\typora-user-images\image-20221012161242878.png)]

  4. 自定义认证类,验证token(尽量写)

(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012210923991.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RneGODEm-1665580438922)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221012192936379.png)]

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

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

相关文章

深度学习 Day 15——利用卷神经网络实现好莱坞明星识别

深度学习 Day 15——利用卷神经网络实现好莱坞明星识别 文章目录深度学习 Day 15——利用卷神经网络实现好莱坞明星识别一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据集3、查看数据集四、数据预处理1、加载数据2、检查数据并可视化数据3、配置数据集五、…

【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?

前言 问:什么是循环依赖? 循环依赖:说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。 问:Spring 如何解决循环依赖? 答:Spring 通过提前曝光机…

vue读取本机的excel文件的两种方式

安装依赖 npm install xlsx --save引入 import XLSX from ‘xlsx’ 更新:2022-04-26 最新的xlsx依赖包引入方式改变,以前的直接引入失败了,切换成以下依赖方式: import { read, utils } from xlsx如果有使用elementUI&#xf…

JavaScript基础万字总结---重点

目录JavaScript简介什么是JavaScript浏览器执行JS过程JS的组成JS的引入方式函数与作用域arguments的使用全局变量与局部变量预解析对象创建对象的三种方式1.利用字面量创建对象2.利用 new Object 创建对象3.利用构造函数创建对象遍历对象属性变量、属性、函数、方法总结new关键…

0053 Exception异常

/*异常Java语言中,将程序执行中发生的不正常情况称为"异常"。(语法错误和逻辑错误不是异常)执行过程中所发生的异常可分为两类1.Error:Java虚拟机无法解决的严重问题,程序会崩溃如:JVM系统内部错…

如何免费使用GPU进行加速?(两种方法)

文章目录如何使用免费的GPU?Kaggle使用免费GPUGoogle Colab 使用免费GPU小结如何使用免费的GPU? 我是学生党,最近在学习深度学习,需要用到GPU加速,现分享两个免费使用GPU的方法。 1、使用 Kaggle 的免费GPU,Kaggle每周可以赠送…

Android 最全Ignore文件 : 解决部分不必要文件上传到Git的问题

1. 背景 我们新建一个Android项目,默认会生成一个.ignore文件 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml .DS_Store /build /captures .ex…

简单了解一下C语言main函数的参数

目录 一、main函数的参数 argc 和 argv 运行效果 需要注意的两个个点 一、main函数的参数 main函数有三个参数,argc、argv和envp,envp参数的应用场景不多,这里就不多介绍,感兴趣的可以自己去了解一下 它的标准写法如下&#x…

<初识Python及编程环境搭建>——《Python》

目录 1. Python 的背景知识: 2. Python 的用途: 3. Python 的优缺点 : 4. 搭建 Python 编程环境: 4.1 安装 Python (1) 找到官方网站 (2) 找到下载页面 (3) 双击安装包 (4) 运行 hello world 4.2 安装 PyCharm 后记&a…

tensorflow多层感知机+mnist数据集

这里写目录标题keras与tensorflow建立模型的不同加载mnisttensorflow多层感知机构建全连接层函数定义感知机各层的输入和输出损失函数、优化器模型准确率计算模型训练参数定义训练开始模型训练效果可视化模型评分利用模型进行预测显示混淆矩阵keras与tensorflow建立模型的不同 …

两栏布局与三栏布局(圣杯布局与双飞翼布局)

两栏布局 右侧绝对定位的写法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&qu…

浅析某城商行手机银行水平授权漏洞问题

-问题现象描述 据报道&#xff0c;某黑客通过软件抓包、PS身份证等非法手段&#xff0c;在某城商行手机银行APP内使用虚假身份信息注册银行Ⅱ、Ⅲ类账户。 其操作方法具体来说&#xff0c;是在注册账户过程中&#xff0c;先输入本人身份信息&#xff0c;待进行人脸识别步骤时…

Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解

一、定义flask-migrate是基于Alembic的一个封装,并集成到Flask中 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。二、Flask-Migrate安装pip install flask-migrate三、使用Flask-Migrate步骤  实例展示: 目录结构:  flask_SQLalchemy:. …

MindSpore体验--在Windows10中源码安装

MindSpore体验--在Windows10中源码安装&#xff08;反面教材&#xff09; 一直以来安装包都是直接pip intall&#xff0c;发现安装MindSpore的操作流程中教学了源码编译安装&#xff0c;借此学习一下使用源码安装。 环境创建 为了方便管理环境&#xff0c;此处我新创建了一个…

多测师肖sir_高级讲师_第2个月第27讲解jmeter性能测试jmeter性能实战

jmeter性能实战 一、单接口性能测试 1、先建接口cms 登录接口 2、在监听器中添加聚合报告 3、设置线程组 &#xff08;1&#xff09;线程组&#xff1a;一个线程组中有若干个请求 &#xff08;2&#xff09;线程 &#xff1a;一个虚拟用户就是一个线程 &#xff08;3&#…

webpack的一些常用打包配置

1.webpack 是什么&#xff1f; webpack 是一个模块化打包工具 2.模块是什么&#xff1f; 模块我理解就是 import xx 后面导入的文件就是一个模块 它可以是js css 图片 等等 3&#xff0c;webpack的配置文件的作用&#xff1f; 就是根据需求自定义配置webpack webpack默认只能打…

轻轻松松搞定分布式Token校验

文章目录前言token存储Token 存储实体login 业务代码枚举类修改存储效果客户端存储token验证前端提交后端校验自定义注解切面处理使用总结前言 没想到前天小水了一篇博文&#xff0c;竟然就火了&#xff1f;&#xff01;&#xff01;既然如此&#xff0c;那我再来一篇&#xf…

第7章 单行函数

1.函数的理解 *函数可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既提高了代码效率&#xff0c;又提高了可维护性。在SQL中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数&#xff0c;可以极大地提高用户对数据库的管理效率。 …

微信小程序|基于小程序实现打卡功能

文章目录一、文章前言二、开发流程及准备三、开发步骤一、文章前言 此文主要在小程序内实现打卡功能&#xff0c;可根据用户位置与公司设定的打卡范围实时判断打卡场景。 二、开发流程及准备 2.1、注册微信公众平台账号。 2.2、准备腾讯地图用户Key。 三、开发步骤 3.1、访问…

【面试题常考!!!】JZ39 数组中出现次数超过一半的数字【五种方法解决】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 字体风格&#xff1a; 红色文字表示&#xff1a;重难点 蓝色文字表示&#xff1a;思路以…