首頁 > 後端開發 > Python教學 > 使用 Django、Djoser 和 JWT 進行使用者身份驗證的逐步指南:第一部分

使用 Django、Djoser 和 JWT 進行使用者身份驗證的逐步指南:第一部分

Patricia Arquette
發布: 2024-12-27 12:24:11
原創
273 人瀏覽過

使用者身份驗證和管理是啟動新專案時的基本功能。由於這些任務經常重複,因此開發了各種軟體包來簡化流程,使開發人員能夠專注於專案的其他方面。 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板