Next.js + Typescript + Django + TailwindcssでSNSを作りたい Part4

2021/12/30に公開

今回は認証機能編になります。
前回までの記事をご覧になっていない方は参考に見てみてください

DjangoでJWT認証を実装する

まず必要なものをインストールします

pipenv install djangorestframework-simplejwt

accoutsアプリを作成する

認証機能はrestapiアプリとは別にアプリを作成します。
分ける理由については以下を見てみてください
https://tech.excite.co.jp/entry/2021/08/10/201821

django-admin startapp accounts

settings.pyにaccoutsアプリを追加する

config/settings.py
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'restapi.apps.RestapiConfig',
    'rest_framework',
    # accoutsを追加
    'accounts.apps.AccountsConfig'
]

また、jwt認証の設定もsettings.pyに追記していきます

config/settings.py
from datetime import timedelta

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(hours=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=3),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': False,
    'AUTH_HEADER_TYPES': ('Bearer', ),
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken', )
}

認証機能のデフォルトをsimplejwtに変更して、simplejwtの設定も書いています。
正直設定については自分もあまりわからないので、コピペしてます。
設定はたくさん種類があるみたいなので、詳しく知りたい人は公式ドキュメントを参考にしてください。
https://django-rest-framework-simplejwt.readthedocs.io/en/latest/index.html

メールアドレス認証をするためにはカスタムユーザーの設定が必要みたいなので、その設定も追記します。

config/settings.py
AUTH_USER_MODEL = 'accounts.UserAccount'

カスタムユーザーモデルを作成

アカウント登録に名前、メールアドレス、パスワード登録するようにしていきます

accounts/models.py
accouts/models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager


class UserManager(BaseUserManager):
    def create_user(self, email, name, password=None):
        if not email:
            raise ValueError('Users must have an email')
        email = self.normalize_email(email)
        email = email.lower()
        user = self.model(
            email=email,
            name=name
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name, password=None):
        user = self.create_user(email, name, password)
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)
        return user


class UserAccount(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField("メールアドレス", max_length=255, unique=True)
    name = models.CharField("名前", max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    objects = UserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def __str__(self):
        return self.email

Djangoではデフォルトでユーザーを作成する機能がついているんだけど、どうやらそれはよろしくないみたいです。
また、ユーザーにはアドレスとパスワード、名前を設定してほしかったので今回はカスタムユーザーを作ります。

内容については下記を参考にしてください

https://docs.djangoproject.com/ja/3.2/topics/auth/customizing/#django.contrib.auth.models.BaseUserManager.normalize_email

https://qiita.com/shitikakei/items/09f244d622ca24f3c891

modelが作成できたら、データベースの構築を行います。
djnagoはコマンドひとつでデータベースの構築が簡単にできちゃいます。便利。

python3 manage.py makemigrations
python3 manage.py migrate

データベースを構築後、管理ユーザーを作成します。

python3 manage.py createsuperuser

カスタムユーザーで設定したメールアドレス、名前、パスワードを入力してユーザーを作成してください。

まとめ

今回はここまでにしておきます。
あまり長いと疲れるからね

次回はURLの設定を進めていきたい

Discussion