ホームページ > バックエンド開発 > Python チュートリアル > Django、Djoser、および JWT を使用したユーザー認証のステップバイステップ ガイド: パート I

Django、Djoser、および JWT を使用したユーザー認証のステップバイステップ ガイド: パート I

Patricia Arquette
リリース: 2024-12-27 12:24:11
オリジナル
273 人が閲覧しました

ユーザー認証と管理は、新しいプロジェクトを開始するときの基本的な機能です。これらのタスクは頻繁に繰り返されるため、プロセスを合理化し、開発者がプロ​​ジェクトの他の側面に集中できるようにするためのさまざまなパッケージが開発されています。そのようなパッケージの 1 つが 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

  • requirements.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 フレームワークと SimpleJWT の構成を含めます:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}
ログイン後にコピー
ログイン後にコピー

カスタム ユーザー モデルを作成しましょう
accounts フォルダーに managers.py ファイルを作成します
accounts/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)
ログイン後にコピー

accounts/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 の構成

Djoser が提供する URL を、Swagger for API ドキュメントとともにプロジェクトの URL パターンに含めます。

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 を抽出し、それらを本文として含む post リクエストをプロジェクトのアクティベーション ルートに送信する必要があります

電子メール送信の設定

最後に、メール送信を設定する必要があります。メール送信にはmailtrapを使用します。電子メールをコンソールに送信するか、選択した電子メール サービスに送信するかを選択できます。

コンソールに電子メールを送信するため

python venv .venv
source .venv/bin/activate
ログイン後にコピー
ログイン後にコピー

外部メールサービスの利用

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

ログイン後にコピー
ログイン後にコピー

プレースホルダーを正しい認証情報に置き換えます

これをテストするために、postman を使用してテストします。

新しいユーザーの作成

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 のアクティベーション ビューをカスタマイズします:

accounts/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',
    ),
}
ログイン後にコピー
ログイン後にコピー

これをテストするには、新しいテスト ユーザーを作成し、電子メールに送信されたアクティベーション URL をクリックします。
URL がプロジェクトに存在しないため、このページにアクセスできます

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

URL から UID とトークンを抽出し、accounts/urls.py ファイルで定義したアクティベーション ルートにポスト リクエストを作成します

スクリーンショットから、私のルートは ;

mkdir userauth
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

UID は MTY です
トークンは cil456-aaf8331efb885f0b4412f35ce544648c

です。

パラメータを使用して、アクティブ化エンドポイントへのポストリクエストを行う

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

これで、Djoser を使用したユーザー認証を設定するチュートリアルは終了です。これで、電子メールによるアクティベーションとカスタマイズ可能なテンプレートを備えた機能的な認証システムが完成しました。このシリーズの第 2 部では、ユーザーが Google、Facebook、GitHub などのサードパーティ サービスを使用してサインアップおよびログインできるようにするソーシャル認証について説明します。続報をお楽しみに!

ご質問やフィードバックがございましたら、お気軽にコメントを残してください。

以上がDjango、Djoser、および JWT を使用したユーザー認証のステップバイステップ ガイド: パート Iの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート