首页 > 其他分享 >drf中jwt应用

drf中jwt应用

时间:2024-04-22 15:56:18浏览次数:21  
标签:res jwt value token 应用 data payload drf

第一步  在登录类中生成 jwt

class Login(MyException,APIView):
    def post(self,request):
        user_obj = models.UserInfo.objects.filter(**request.data).first()
        if not user_obj:
            return Response({"code":1001, "msg":"用户名密码错误"})
        # 生成jwt token并返回
        headers = {
            'typ': 'jwt',
            'alg': 'HS256'
        }
        # 构造payload
        payload = {
            'user_id': user_obj.id,  # 自定义用户ID
            'username': user_obj.username,  # 自定义用户名
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5)  # 超时时间
        }
        token = jwt.encode(payload=payload, key=settings.SECRET_KEY, algorithm="HS256", headers=headers)
        print("t:",token)
        return Response({"code":0, "msg":"登录成功", "token":token,"username":user_obj.username,"userid":user_obj.id})

第二步 在认证类中校验 jwt合法性

  

class TestAuthentication(BaseAuthentication):
def authenticate(self, request):
    token = request.query_params.get("token")
    if not token:
        raise AuthenticationFailed({"code":1002,"msg":"必须携带token"})
    # 2.合法性
    try:
        # print(token)
        verified_payload = jwt.decode(token, settings.SECRET_KEY, algorithms="HS256")
        print("v:",verified_payload)
        current_timestamp = int(datetime.datetime.now().timestamp())
        print(current_timestamp)
        print(verified_payload.get("exp"))
        #判断是否需要更新jwt
        verified_payload["exp_time"] = verified_payload.get("exp") - current_timestamp
        # 获取当前时间 vs 有效期
        return (verified_payload, token)
    except Exception as e:
        print(e)
        raise AuthenticationFailed("认证失败")

 

第三步 写一个更新jwt的类

class UpdateTokenView(ResView,APIView):
    authentication_classes = [MyAuthentication]

    def get(self, request):
        print("info:",request.user, request.auth)
        # 生成jwt token并返回
        headers = {
            'typ': 'jwt',
            'alg': 'HS256'
        }
        # 构造payload
        payload = {
            'user_id': request.user['user_id'],  # 自定义用户ID
            'username': request.user['username'],  # 自定义用户名
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5)  # 超时时间
        }
        token = jwt.encode(payload=payload, key=settings.SECRET_KEY, algorithm="HS256", headers=headers)
        return Response(token)

第四步 在统一返回格式处,添加过期字段

class ResView:
    def finalize_response(self, request, response, *args, **kwargs):
        response = super().finalize_response(request, response, *args, **kwargs)
        if response.exception:
            return response
        response.data = {"code": 0, "data": response.data,"exp_time": request.user.get("exp_time")}
        return response

第五步 添加url

    path('api/jwt/update/', views.UpdateTokenView.as_view()),

第六步 前端部分 在 store中创建一个更新用户信息中token的函数

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

export const userInfoStore = defineStore('userInfo', () => {

    const userString = ref(localStorage.getItem("info"))
    const userDict = computed(() => userString.value ? JSON.parse(userString.value) : null)
    const userId = computed(() => userDict.value ? userDict.value.id : null)
    const userName = computed(() => userDict.value ? userDict.value.username : null)
    const userToken = computed(() => userDict.value ? userDict.value.token : null)


    function doLogin(info) {
      localStorage.setItem("info",JSON.stringify(info));
      userString.value = JSON.stringify(info)
    }


    function Logout(){
      localStorage.clear()
    }

    function updateUserInfo(new_token) {
      const userInfoObject = JSON.parse(userString.value);
      userInfoObject.token = new_token;
      localStorage.setItem("info",JSON.stringify(userInfoObject));
      userString.value = JSON.stringify(userInfoObject)
  }

    return {userDict,userId,userName,userToken,doLogin,Logout,updateUserInfo }
})

第七步 判断返回的数据中 过期时间字段,如果即将过期,就再发起一次更新token的操作

    onMounted(function getdata(){
    elLoading.value = true
    _axios.get("/api/project/").then(
        (res) =>{
            console.log("res.data:",res.data.data)
            console.log("res.data.count:",res.data.data.count)
            console.log("res.data.results.len:",res.data.data.page_size)
            console.log("res.data.exp:",res.data.exp_time)
            if (res.data.exp_time > 0 && res.data.exp_time < 30 ) {
                console.log("需要去更新token")
                _axios.get("/api/jwt/update/").then(
                    (res) =>{
                        console.log(res.data.data)
                        let new_token = res.data.data
                        userdata.updateUserInfo(new_token)
                    }
                )
            }
            response.value = res.data.data.results
            elLoading.value = false
            // 返回数据总数和每页条数
            page.value = {
                count:res.data.data.count,
                page_size:res.data.data.page_size
            }

        }
    ).catch((reson) => {
        console.log("reson:",reson)
    })
    })

 

标签:res,jwt,value,token,应用,data,payload,drf
From: https://www.cnblogs.com/liruixin/p/18150777

相关文章

  • Linux应用程序获取线程栈的信息
    一.参考网址1. Linux应用程序设计:用一种讨巧方式,来获取线程栈的使用信息2.chatGPT的输出二.代码实战1.适用于ARM的汇编代码1#define_GNU_SOURCE//没有此句话,则编译会出错23#include<stdio.h>4#include<string.h>5#include<pthread.h......
  • 实验5 循环结构程序设计(while、do-while语句的应用)
    c语言程序设计——实验报告五实验项目名称:实验项目类型:验证性实验日期:一、实验目的二、实验硬、软件环境Windows计算机、Devc6.0三、实验内容及步骤实验内容:编写程序:(1)用while语句计算自然数列1,2,3……,n的和,n的值在程序执行时输入。(2)用do-while语句计算n的阶乘(3)......
  • docker Java 应用堆内存配置
    引言本文主要是讲解InitialRAMPercentage、MinRAMPercentage,MaxRAMPercentage三个JVM参数之间的区别。参数由Java8update191引入,主要是用于配置运行在物理机或者容器中的Java应用堆内存大小。InitialRAMPercentage-XX:InitialRAMPercentage用于配置堆的初始化......
  • flutter 移动应用程序中打开URL
    url_launcher:^6.2.5 在Flutter中,url_launcher库是用于在移动应用程序中打开URL的常用工具。它允许你通过调用系统的浏览器或其他应用程序来打开指定的URL,比如网页链接、电子邮件链接、电话号码等。这个库提供了一种简单的方法来实现在应用中跳转到外部链接的功能,增强了应用的......
  • 京东广告研发——AIGC在京东广告创意的技术应用
    一、前言现有的广告图片大多依赖人工制作,存在效率和成本的限制。尽管最近AIGC技术取得了卓越的进展,但其在广告图片的应用还存在缺乏卖点信息、难以规模化和个性化以及不利于卖点展示等问题。为了解决上述业界难题,京东广告部门在2023年提出了一系列创新性方法:首先提出了关系感知......
  • 精通中间件测试:Asp.Net Core实战指南,提升应用稳定性和可靠性
    引言在上一章节我们实战了在Asp.NetCore中的项目实战,这一章节讲解一下如何测试Asp.NetCore的中间件。TestServer还记得我们在集成测试中提供的TestServer吗?TestServer是由Microsoft.AspNetCore.TestHost包提供的。包含了用于在测试环境中模拟ASP.NETCore应用程序的类......
  • DRF之类视图详解介绍
    一、视图基类1、APIView想要使用APIView,需要先导入:fromrest_framework.viewsimportAPIViewAPIView继承了View,同时也进行了升级,APIView是适合前后端分离的,而View是适合前后端不分离的。View并没有对请求进行处理,而APIView会对请求进行处理,将请求体的JSON数据转成......
  • DRF之路由组件
    一、路由的写法1、原始写法(1)介绍是指手动编写路由规则的方式。使用path()函数或re_path()函数来定义路由规则,并将其与对应的视图函数或类关联起来。(2)示例假设有一个名为book的应用,它包含了一个处理图书列表的视图函数book_list,以及一个处理单个图书详情的视图函数book_de......
  • JWT
    JWT介绍​ 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用JsonWebToken(本质就是token)认证机制。构成和工作原理JWT的构成​ JWT就是一长串字符串,被.分成三段,分别是头部,载荷,签名header​ jwt的头部承载两部......
  • 队列-经典应用案例
    这里来简单举几个经典的场景如"击鼓传花","字符串回文监测"等来加深对队列这个结构的直观认识.单端队列-击鼓传花这里先介绍一种队列的变种叫循环队列,即元素从队首出队后,立即又进行从队尾入队,类似行程了一个圈,与之对应的一个经典游戏就是"击鼓传花",英文叫ho......