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

yizhihongxing

下面是关于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日

相关文章

  • Python3利用SMTP协议发送E-mail电子邮件的方法

    下面是完整的Python3利用SMTP协议发送E-mail电子邮件的方法攻略。 SMTP协议简介 SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的标准协议。SMTP协议是基于文本的,它定义了一系列规则,用于服务器之间的邮件传输。 发送E-mail的Python库 Python提供了smtplib库来发送E-mai…

    人工智能概论 2023年5月25日
    00
  • Java中获取MongoDB连接的方法详解

    Java中获取MongoDB连接的方法详解 在Java中使用MongoDB进行数据库操作,需要先获取到MongoDB的连接。本文将介绍如何使用Java获取MongoDB连接的方法。 1. Maven依赖 首先需要在Maven项目中添加MongoDB的依赖: <dependency> <groupId>org.mongodb</g…

    人工智能概论 2023年5月25日
    00
  • 一文教会你用nginx+uwsgi部署自己的django项目

    一文教会你用nginx+uwsgi部署自己的django项目 本文将详细讲解如何使用nginx和uwsgi部署自己的django项目,包括nginx和uwsgi的安装配置、django项目的配置和运行、以及一些常见问题和解决方案。 安装nginx和uwsgi 在部署django项目前,我们需要先安装nginx和uwsgi。以下是安装步骤: 安装nginx 更…

    人工智能概论 2023年5月25日
    00
  • Jenkins集成Gitlab实现自动化部署的全过程记录

    Jenkins集成Gitlab实现自动化部署的全过程记录 Jenkins是一款开源的自动化构建工具,可以实现自动化部署、测试和构建。Gitlab是一款开源的git仓库管理工具。通过将Jenkins与Gitlab相结合,可以实现自动化部署的全过程记录。本文将详细说明如何在Jenkins中集成Gitlab,并实现自动化部署的全过程记录。 前置条件 在开始之前,需…

    人工智能概论 2023年5月25日
    00
  • python数字转对应中文的方法总结

    那么我将为您详细介绍如何将Python中的数字转换为对应的中文。 首先,我们可以用下面这个算法将阿拉伯数字转换为中文数字: 构建阿拉伯数字和中文数字的对应关系,包括数字0-9、10-12、100、1000、10000等; 将数字从右向左分组,每组包含4个数字; 对每组数字进行处理,首先判断是否包含0,如果有则不添加“零”;其次根据数值和组数确定数字的单位,例…

    人工智能概论 2023年5月25日
    00
  • CentOS 4.0安装配置Nginx的方法

    下面是详细的 “CentOS 4.0安装配置Nginx的方法”: 环境准备 在进行安装Nginx之前,我们需要准备好以下环境: CentOS 4.0系统 gcc编译环境:由于Nginx并不是通过yum的方式进行安装,我们需要手动编译,因此需要先安装好gcc编译环境。 安装Nginx 以下是安装Nginx的详细步骤: 下载并解压Nginx 在终端执行以下命令下…

    人工智能概览 2023年5月25日
    00
  • 使用Node.js搭建Web服务器

    使用Node.js搭建Web服务器是一项非常常见的操作,以下是基本步骤及示例说明: 步骤一:安装Node.js 首先,需要在自己的电脑上安装Node.js,可以前往官网下载并安装最新版本的Node.js。 步骤二:创建Node.js项目 在命令行中进入项目所处目录,运行以下命令: npm init 根据提示填写项目信息,会自动生成一个package.json…

    人工智能概览 2023年5月25日
    00
  • 安装Nginx+Lua开发环境

    安装Nginx+Lua开发环境需要进行以下步骤: 安装依赖包 在安装Nginx之前,需要安装一些依赖包: sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev 下载并编译Nginx 在官网 https://…

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