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日

相关文章

  • Nodejs 识别图片类型的方法

    Nodejs 识别图片类型的方法 在 Node.js 中,我们可以使用第三方包 file-type 来识别图片类型,它提供了一个简单的 API 来帮助我们快速判断文件类型。 安装 可以通过 npm 安装: npm install file-type 使用 在使用 file-type 之前,需要确保你已经将图片的文件内容读取到了内存中,如果你只有图片的文件名,…

    人工智能概论 2023年5月25日
    00
  • Python实现自动回复QQ消息功能的示例代码

    以下是Python实现自动回复QQ消息功能的攻略。 1. 什么是自动回复QQ消息功能 自动回复QQ消息功能是指通过编写程序,实现在用户离线或无法回复QQ消息时,自动回复设定内容、表情等,以维持正常的联络和沟通。 2. 实现自动回复QQ消息的基本逻辑 使用Python实现自动回复QQ消息功能的基本逻辑如下: 连接QQ客户端(使用QQ协议); 监听QQ消息; 分…

    人工智能概览 2023年5月25日
    00
  • Python Setuptools的 setup.py实例详解

    《Python Setuptools的 setup.py实例详解》是一篇关于如何使用Python Setuptools的文章,这里将提供完整的攻略。 前置条件 在使用Python Setuptools之前,需要保证已经安装了Python环境以及setuptools库。如果没有安装过setuptools,可以通过以下命令进行安装: pip install se…

    人工智能概览 2023年5月25日
    00
  • nginx+tomcat 通过域名访问项目的实例

    下面就是详细讲解“nginx+tomcat 通过域名访问项目”的完整攻略。 环境说明 服务器环境: CentOS 7(64位) nginx 1.16.1 tomcat 8.5.50 域名:example.com 目标项目:project 思路 通过nginx作为反向代理服务器,将访问example.com的请求转发到tomcat的特定端口,从而访问到项目。 …

    人工智能概览 2023年5月25日
    00
  • Perl5 OOP学习笔记第1/2页

    如果想学习 Perl5 面向对象编程(OOP),可以参考下面的攻略: 第1页 什么是面向对象编程? 对象是什么? 对象是程序中的一个实体,它包括一些属性和可以对这些属性执行的操作。 面向对象编程(OOP)是什么? OOP 是一种编程范式,使用面向对象的方式描述和解决问题。在 OOP 中,程序被组织成对象,对象之间可以互相交互来完成任务。 这里还需要注意 OO…

    人工智能概论 2023年5月25日
    00
  • 树莓派安装OpenCV3完整过程的实现

    下面是树莓派安装OpenCV3完整过程的实现的攻略。 1. 安装OpenCV依赖库 在树莓派上安装OpenCV之前,需要先安装相关的依赖库。打开终端,输入以下命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential cmake pkg-config su…

    人工智能概论 2023年5月25日
    00
  • 详解SpringBoot开发案例之整合定时任务(Scheduled)

    下面就是详解SpringBoot开发案例之整合定时任务(Scheduled)的完整攻略。 一、前言 在我们的日常开发中,经常会有需要在指定的时间执行某些任务的需求。比如说定期产生统计报表、备份数据、扫描无效文件等等。在Java开发中,我们可以使用Java自带的Timer/TimerTask类或是Quartz等第三方框架实现定时执行任务。在Spring Boo…

    人工智能概览 2023年5月25日
    00
  • Django博客系统注册之创建用户模块应用

    下面是关于Django博客系统注册之创建用户模块应用的完整攻略。 创建用户模块应用 要创建用户模块应用,我们需要使用Django自带的auth模块。该模块提供了用户认证和授权的常用函数和类,可以帮助我们快速构建用户模块。 我们可以通过以下步骤创建用户模块应用: 1. 创建应用 首先,在项目目录下执行以下命令创建一个名为users的应用: python man…

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