Django项目中使用JWT的实现代码

下面是关于Django项目中使用JWT的实现代码的完整攻略,包括最基本的JWT的使用和带有自定义用户模型的JWT使用:

基本JWT的使用

步骤1:安装相关库

在Django项目中使用JWT,需要安装两个Python库:pyjwtdjango-rest-framework-jwt,可以使用以下命令进行安装:

pip install pyjwt
pip install djangorestframework-jwt

步骤2:配置JWT

在Django项目的settings.py文件中添加如下配置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

JWT_AUTH = {
    'JWT_SECRET_KEY': '<your_secret_key>',
    'JWT_ALGORITHM': 'HS256',
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=1),
}

其中,JWT_SECRET_KEY是自定义的JWT密钥,可以在环境变量中定义。

步骤3:用户认证

在Django项目中,可以使用DRF的TokenObtainPairView视图进行用户认证。假设我们的用户模型是Django自带的User模型,那么可以创建一个视图类继承自TokenObtainPairView,并指定用户模型为User,如下所示:

from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from django.contrib.auth.models import User

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_user_model(cls):
        return User

    def validate(self, attrs):
        data = super().validate(attrs)
        data['username'] = self.user.username
        return data

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

这样,就可以在URL中使用CustomTokenObtainPairView.as_view()来进行用户认证,并获取JWT。

步骤4:JWT的使用

获取JWT之后,可以将JWT作为请求头中的Authorization字段,用于API调用上。例如,在Django视图中,可以使用如下方式获取JWT中的用户信息:

from rest_framework_jwt.authentication import JSONWebTokenAuthentication

class DemoView(APIView):
    authentication_classes = (JSONWebTokenAuthentication,)

    def get(self, request):
        user = request.user
        # do something

带有自定义用户模型的JWT使用

如果Django项目中使用的是自定义用户模型,那么需要对JWT进行相应的定制,以实现使用自定义用户模型的用户认证和获取JWT。以下是实现代码示例:

步骤1:安装相关库

安装django-allauthdjangorestframework-simplejwt,可以使用以下命令进行安装:

pip install django-allauth
pip install djangorestframework-simplejwt

步骤2:配置JWT

在Django项目的settings.py文件中添加如下配置:

AUTH_USER_MODEL = 'accounts.User'

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': False,
    'JWT_SECRET_KEY': '<your_secret_key>',
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': timedelta(minutes=60),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,
    'JWT_ALLOW_EXPIRED': False,
    'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
    'JWT_AUTH_COOKIE': None,
}

其中,AUTH_USER_MODEL为自定义用户模型,JWT_SECRET_KEY是自定义的JWT密钥,可以在环境变量中定义。

步骤3:用户认证

在Django项目中,可以使用DRF的TokenObtainPairView视图进行用户认证。在自定义用户模型中,可以通过以下方式创建一个用户认证视图类:

from rest_framework.views import APIView
from rest_framework_simplejwt.views import TokenObtainPairView
from allauth.socialaccount.providers.weibo.views import WeiboOAuth2Adapter
from rest_auth.registration.views import SocialLoginView
from rest_auth.serializers import TokenSerializer
from rest_auth.views import LoginView
from django.contrib.auth import login
from django.shortcuts import redirect
from rest_framework_simplejwt.tokens import RefreshToken
import datetime

class CustomLoginView(LoginView):
    serializer_class = TokenSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            time_delta = datetime.datetime.now() - datetime.datetime.fromtimestamp(
                request.META.get('HTTP_USER_AGENT'), datetime.datetime).replace(tzinfo=None)
            refresh = RefreshToken.for_user(serializer.validated_data['user'])

            if time_delta.days == 0 and time_delta.seconds < 1800:
                res = {"code": 200, "data": {"access_token": str(refresh.access_token)}, "msg": "OK"}
            else:
                res = {"code": 400, "msg": "验证码无效!"}

            login(request, serializer.validated_data['user'])

            response = Response(res)
            response.set_cookie(key='token', value=res.get('data').get('access_token'),
                                expires=refresh.access_token.payload.get('exp'), httponly=True)
            return response


class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

在该视图类中,使用allauth库的WeiboOAuth2Adapter进行社交登录(这是示例代码,根据使用情况进行相应的修改),使用rest_auth库的SocialLoginView进行社交登录认证,在登录完成后,将JWT写入cookie中。

步骤4:JWT使用

在Django视图中,可以使用如下方式获取JWT中的用户信息:

from rest_framework_simplejwt.authentication import JWTAuthentication

class DemoView(APIView):
    authentication_classes = (JWTAuthentication,)

    def get(self, request):
        user = request.user
        # do something

以上是使用自定义用户模型的JWT使用的实现代码示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django项目中使用JWT的实现代码 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 基于Tensorflow使用CPU而不用GPU问题的解决

    接下来我会详细讲解如何使用Tensorflow在CPU上运行。大体流程如下: 安装Tensorflow CPU版 由于GPU需要独立的显卡支持,所以需要单独安装Tensorflow GPU版。而使用CPU时,则只需要安装CPU版即可。可以通过以下命令安装: pip install –upgrade tensorflow-cpu 测试安装是否成功 安装完成后…

    人工智能概论 2023年5月24日
    00
  • PHP程序员玩转Linux系列 Linux和Windows安装nginx

    PHP程序员玩转Linux系列:Linux和Windows安装nginx攻略 一、什么是nginx Nginx是一个高性能、高并发的Web服务器,它既可以充当静态Web服务器,也可以作为反向代理服务器、负载均衡服务器、邮件代理服务器或者HTTP缓存服务器。目前,nginx已经成为许多大型网站的主流Web服务器之一。 二、Linux安装nginx 2.1 使用…

    人工智能概览 2023年5月25日
    00
  • python opencv 读取本地视频文件 修改ffmpeg的方法

    下面是详细讲解“python opencv 读取本地视频文件 修改ffmpeg的方法”的完整攻略: 一、前置条件 在进行本文讲解前,请确保你已经安装好了 Python 和 OpenCV,以及正确配置了环境变量。 二、读取本地视频文件 使用 Python 调用 OpenCV 读取本地视频文件,可以采用以下代码: import cv2 cap = cv2.Vid…

    人工智能概览 2023年5月25日
    00
  • centos+nginx+uwsgi+Django实现IP+port访问服务器

    综合实现“centos+nginx+uwsgi+Django实现IP+port访问服务器”需要完成以下几个步骤: 安装必要的软件和库,其中包括centos、nginx、uwsgi、Django等,具体操作如下: # 安装centos sudo yum update sudo yum install epel-release sudo yum install …

    人工智能概论 2023年5月25日
    00
  • ChatGpt无法访问或错误码1020的几种解决方案

    当你在使用 ChatGpt 进行开发时,有时可能会遇到无法访问或错误码 1020 的问题。这通常是由于出现了 IP 防火墙导致的。以下是几种解决方案,可以帮助你解决这一问题。 解决方案一:更新 IP 白名单 如果你在使用 ChatGpt 时遇到错误码 1020,那么很可能是因为你所使用的 IP 被防火墙屏蔽了。为了解决这一问题,你需要将你的 IP 加入到 I…

    人工智能概览 2023年5月25日
    00
  • 分享Python获取本机IP地址的几种方法

    下面我将为您详细讲解“分享Python获取本机IP地址的几种方法”的完整攻略。 目录 前言 获取本机IP地址的方式 使用socket模块获取IP地址 使用netifaces模块获取IP地址 使用ipaddress模块获取IP地址 结束语 前言 在日常开发中,获取本机IP地址是一项比较常见的需求。本文将分享几种使用Python获取本机IP地址的方法,帮助大家更…

    人工智能概览 2023年5月25日
    00
  • Matlab利用随机森林(RF)算法实现回归预测详解

    Matlab利用随机森林(RF)算法实现回归预测详解 介绍 随机森林算法是一种集成学习方法,用于分类和回归问题,由于它的高准确性、可解释性和易实现性,在各种领域中得到了广泛的应用。 本篇文档将详细讲解如何在Matlab中利用随机森林算法实现回归预测。 准备工作 在开始之前,您需要先安装Matlab,并确保安装了以下工具箱:Statistics and Mac…

    人工智能概论 2023年5月24日
    00
  • Django路由层如何获取正确的url

    Django框架的路由层负责将HTTP请求映射到相应的视图函数。在Web开发中,获取正确的URL是非常重要的,可以通过以下步骤实现。 1. 定义URL路由模式 在Django应用程序中,首先需要定义URL路由模式。这可以通过在应用程序的urls.py文件中定义来实现。路由模式通常由路径模式、视图函数和URL名称组成。例如,以下代码定义了一个使用正则表达式匹配…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部