首页 >后端开发 >Python教程 >使用 Django、Djoser 和 JWT 进行用户身份验证的分步指南:第一部分

使用 Django、Djoser 和 JWT 进行用户身份验证的分步指南:第一部分

Patricia Arquette
Patricia Arquette原创
2024-12-27 12:24:11266浏览

用户身份验证和管理是启动新项目时的基本功能。由于这些任务经常重复,因此开发了各种软件包来简化流程,使开发人员能够专注于项目的其他方面。 Djoser 就是这样的一个包,它与 Django REST Framework (DRF) 无缝集成来处理身份验证和用户管理。在本指南中,我将引导您使用 Djoser 构建完整的用户身份验证系统,包括设置电子邮件功能和自定义电子邮件模板。

设置项目

首先为您的项目创建一个目录:

mkdir userauth

导航到您首选 IDE 中的新目录,设置虚拟环境并激活它

python venv .venv
source .venv/bin/activate

接下来,安装必要的软件包:

pip install django djangorestframework djoser djangorestframework_simplejwt social-auth-app-django drf-yasg

注意:一些依赖项,例如social-auth-app-django,可能会随Djoser 自动安装。如果是这样,您可以跳过显式添加它们

安装后,生成一个requirements.txt 文件来跟踪您的依赖项:

pip freeze > requirements.txt

您应该会看到requirements.txt 文件中列出的所有已安装的软件包,包括所有依赖项。

创建 Django 项目并让服务器运行

django-admin startapp userauth . 

这将创建 django 项目。然后我们需要在项目中创建一个应用程序

python manage.py startapp accounts

您的项目目录现在应包含以下内容:

  • .venv(虚拟环境)

  • 帐户/(身份验证应用程序)

  • userauth/(主项目文件夹)

  • manage.py

  • 需求.txt

配置项目

将所需的软件包和应用程序添加到settings.py中的INSTALLED_APPS部分:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

     # Third Party Apps
    'rest_framework',
    'djoser',
    'rest_framework_simplejwt',
    'drf_yasg',

    # Local Apps
    'accounts',
]

更新您的 settings.py 以包含 Django REST Framework 和 SimpleJWT 的配置:

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

让我们创建自定义用户模型
在accounts文件夹中创建managers.py文件
账户/managers.py

from django.contrib.auth.models import BaseUserManager


class CustomUserManager(BaseUserManager):

    def create_user(self, email, username, password=None, **extra_fields) -> None:

        if not username:
            raise ValueError("Username is required")

        if not email:
            raise ValueError("Email is required")


        email = self.normalize_email(email)
        user = self.model(email=email, username=username, **extra_fields)
        user.set_password(password)
        user.save()
        return user


    def create_superuser(self, email, username, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")

        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self.create_user(email, username, password, **extra_fields)

账户/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from accounts.managers import CustomUserManager



class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    is_verified = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()


    def __str__(self):
        return self.email

将此行添加到您的settings.py 文件中

AUTH_USER_MODEL = 'accounts.CustomUser'

我们可以继续进行迁移,然后运行本地开发服务器

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

到目前为止应该没有问题。

配置 Djoser URL

在项目的 URL 模式中包含 Djoser 提供的 URL,以及 API 文档的 Swagger:

userauth/urls.py

from django.contrib import admin
from django.urls import include, path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi


schema_view = get_schema_view(
    openapi.Info(
        title="User Accounts API",
        default_version="v1",
        description="REST implementation of Django authentication system using Djoser",
        contact=openapi.Contact(email="contact@snippets.local"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/docs', schema_view.with_ui("swagger", cache_timeout=0), name="swagger-ui"),
    path('api/', include('djoser.urls')), 
    path('api/', include('djoser.urls.jwt'))
]

通过浏览器访问http://127.0.0.1:8000/api/docs/查看API文档。

配置 Djoser 设置

可以为 djoser 配置的所有设置都可以在此处找到 Djoser 设置

userauth/settings.py

mkdir userauth

这里我们要求用户接收激活电子邮件。激活 URL 是发送到用户电子邮件以供用户点击的链接。需要提取令牌和 uid,并将发布请求作为正文发送到项目中的激活路由

配置电子邮件发送

最后我们需要配置电子邮件发送。我将使用 mailtrap 发送电子邮件。您可以选择将电子邮件发送到控制台或您选择的任何电子邮件服务。

用于将电子邮件发送到您的控制台

python venv .venv
source .venv/bin/activate

使用外部邮件服务

pip install django djangorestframework djoser djangorestframework_simplejwt social-auth-app-django drf-yasg

用正确的凭据替换占位符

为了测试这一点,我们将使用邮递员来测试它。

创建新用户

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

然后发送给用户的激活邮件

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

自定义电子邮件模板

让我们稍微自定义一下电子邮件模板
在accounts目录中创建一个模板文件夹,然后创建一个电子邮件文件夹并继续在其中创建模板文件夹

帐户/模板/电子邮件/activation_email.py
我们自定义了djoser自带的默认邮箱

pip freeze > requirements.txt

要在模板中自定义站点名称,请将此行添加到 djoser 设置

django-admin startapp userauth . 

电子邮件模板现在看起来像这样

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

扩展激活视图

在本文的最后一部分,我们将进行电子邮件验证。
我们首先在accounts/views.py中自定义激活视图:

帐户/views.py

python manage.py startapp accounts

我们正在扩展 djoser 上的激活视图以对其进行自定义,并将用户模型上的 is_verified 字段设置为 true

accounts/urls.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

     # Third Party Apps
    'rest_framework',
    'djoser',
    'rest_framework_simplejwt',
    'drf_yasg',

    # Local Apps
    'accounts',
]

项目级别的 URL 文件
userauth/urls.py

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

要测试此功能,请创建一个新的测试用户,然后单击发送到电子邮件的激活网址。
您到达此页面是因为该网址在我们的项目中不存在

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

从 url 中提取 uid 和 token,并向您在accounts/urls.py 文件中定义的激活路由发出发布请求

从截图来看,我的路线是;

mkdir userauth

uid 是 MTY
代币为 cil456-aaf8331efb885f0b4412f35ce544648c

使用参数向激活端点发出 POST 请求

Step-by-Step Guide to User Authentication with Django, Djoser, and JWT: Part I

使用 Djoser 设置用户身份验证的教程到此结束。您现在拥有一个具有电子邮件激活和可自定义模板的功能身份验证系统。在本系列的第二部分中,我们将探讨社交身份验证,使用户能够使用 Google、Facebook 和 GitHub 等第三方服务进行注册和登录。更多精彩敬请期待!

如果您有任何问题或反馈,请随时发表评论。

以上是使用 Django、Djoser 和 JWT 进行用户身份验证的分步指南:第一部分的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn