首页 > 其他分享 >drf之jwt使用

drf之jwt使用

时间:2023-09-21 19:36:41浏览次数:33  
标签:登录 jwt JWT token user 使用 import drf

目录

简介

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT构成

第一部分我们称它为头部(header);
第二部分我们称其为载荷(payload, 类似于飞机上承载的物品);
第三部分是签证(signature).

JWT的使用

安装

  • djangorestframework-jwt

快速使用

定制程度低,但使用起来方便,什么都不需要自己配置。
此方法只能限制使用django的auth表

  1. 添加路由
    urls.py
from rest_framework_jwt.views import obtain_jwt_token
# 添加如下路由
path('login/', obtain_jwt_token),
  1. 创建登录用户
python38 manage.py createsuperuser
  1. 使用postman发送请求
    请求地址:http://127.0.0.1:8000/login/
    请求类型:POST
    请求数据:

如下图:
image

总结:可以看到,我们只是配置了一个路由,就会自动生成了一个登录接口,会返回一个token字符串。但此方法一般不太适合在生产中使用,因为返回的信息不符合标准。

定制返回格式

  1. 创建一个函数
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'code': 100,
        'msg': '登录成功',
        'token': token,
        'username': user.username
    }
  1. 在settings.py中添加配置
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.mytoken.jwt_response_payload_handler',
}
  1. 使用postman发送请求
    image

jwt认证类

有一些功能我们想让用户登录后才能访问,不登录则报没有权限,可以按以下方法配置

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated

# 在需要认证的类中添加以下两个配置
authentication_classes = [JSONWebTokenAuthentication]   # 验证token对不对(不验证是否携带用户信息)
permission_classes = [IsAuthenticated]  # 验证是否携带用户信息

使用postman发请求,先使用login接口获取用户的token,然后再get请求中的headers中添加 Authorization 的键,值是 “jwt token”,如下图:
image

authentication.py

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.settings import api_settings
from user.models import UserInfo
import jwt


jwt_decode_handler = api_settings.JWT_DECODE_HANDLER


class JsonWebTokenAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 在请求头中取出token
        token = request.META.get('HTTP_TOKEN')
        if token:
            try:
                payload = jwt_decode_handler(token)
                user = UserInfo.objects.get(pk=payload.get('user_id'))
                # user = UserInfo(pk=payload.get('user_id'), username=payload.get('username'))
                return user, token
            except jwt.ExpiredSignature:
                raise AuthenticationFailed('用户会话已过期,请重新登录')
            except jwt.DecodeError:
                raise AuthenticationFailed('用户认证失败,请重新登录')
            except jwt.InvalidTokenError:
                raise AuthenticationFailed('用户认证无效,请重新登录')
            except Exception as e:
                raise AuthenticationFailed('未知异常')
        raise AuthenticationFailed('您未登录,请先登录')

标签:登录,jwt,JWT,token,user,使用,import,drf
From: https://www.cnblogs.com/smyz/p/17377612.html

相关文章

  • 完整教程:使用SPRING BOOT实现大文件断点续传及文件校验
    一、简介随着互联网的快速发展,大文件的传输成为了互联网应用的重要组成部分。然而,由于网络不稳定等因素的影响,大文件的传输经常会出现中断的情况,这时需要重新传输,导致传输效率低下。为了解决这个问题,可以实现大文件的断点续传功能。断点续传功能可以在传输中断后继续传输,而不需......
  • 使用 utools 调用欧路词典进行快捷查词
    utools本身有很多在线词典,要么太慢,要么功能不够丰富,有个本地词典作为补充最好。使用到的插件:自动化脚本新增自定义的脚本constword=ENTER.payload;const{exec}=require("child_process");exec(`start/b"""C:\\ProgramFiles\\eudic\\eudic.exe"-w${word}`);......
  • 使用 Databend 加速 Hive 查询
    作者:尚卓燃(PsiACE)澳门科技大学在读硕士,Databend研发工程师实习生ApacheOpenDAL(Incubating)Committerhttps://github.com/PsiACE随着架构的不断迭代和更新,大数据系统的查询目标也从大吞吐量查询逐步转移转向快速的交互式查询,对于查询的及时响应提出了更高要求。许多企业......
  • 使用Echarts实现
    1、先准备好两组数据2、找到下面的series标签直接在下面再多加一个中括号的数据,定义好名称啥的:3、发现没有图例,加上!很神奇的一点是,之前名称用data写,图例怎样都不显示,然后我换成name之后,就显示出来啦!再加上x轴和y轴的名称:ok!......
  • Linux 查看端口使用情况
    之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下:1.netstat -anp |grep 端口号如下,我以3306为例,netstat -anp |grep 3306(此处备注下,我是以普通用户操作,故加上了sudo,如果是以root用户操作,不用加sudo即可查看),如下图1:         ......
  • 迁移虚拟机使用遇到的问题
    迁移背景本次在迁移前的主机系统为REDHAT8,每台机器配置了专门的ip+搭建好yum环境迁移时虚拟机版本需要统一如果不统一,需要在.vmx文件中修改 2.虚拟网络编辑器要与迁移前保持一致 3.搭建好yum路径要与迁移前路径保持一致4.如果开机后ifconfig不显示,需要使用nmclinon......
  • 提高iOS应用程序安全性:使用Keychain和加密技术保护iOS应用程序数据
    ​目录 转载:怎么保护苹果手机移动应用程序ipa中文件安全?前言1.对敏感文件进行文件名称混淆  ​编辑2.更改文件的MD5值3.增加不可见水印处理3.对html,js,css等资源进行压缩5.删除可执行文件中的调试信息 转载:怎么保护苹果手机移动应用程序ipa中文件安全?前......
  • java日期时间类现在(java8及以后版本)推荐使用java.time 包中的类
    以下信息由AI模型"文心一言"提供,仅供参考:在Java8之后,推荐使用新的日期和时间API,即java.time包中的类。主要有以下原因:更好的设计和功能:新的日期和时间API在设计和功能上都更优。它包括时间、日期、时间间隔等更全面的表示,并支持更准确的计算和格式化。更全面的时间......
  • IDEA使用Maven的Tomcat7插件运行项目
    首先在插件商店安装MavenHelper<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</ve......
  • Linux内核信号量(semaphore)使用与源码分析
    https://blog.csdn.net/Auris/article/details/107404962一.在Linux内核驱动中使用信号量(semaphore)常规操作步骤:[0].定义信号量结构体变量;structsemaphoresem; [1].初始化信号量变量 voidsema_init(structsemaphore*sem,intn); eg.sema_ini......