✨
Next.js + Typescript + Django + TailwindcssでSNSを作りたい Part4
今回は認証機能編になります。
前回までの記事をご覧になっていない方は参考に見てみてください
DjangoでJWT認証を実装する
まず必要なものをインストールします
pipenv install djangorestframework-simplejwt
accoutsアプリを作成する
認証機能はrestapiアプリとは別にアプリを作成します。
分ける理由については以下を見てみてください
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の設定も書いています。
正直設定については自分もあまりわからないので、コピペしてます。
設定はたくさん種類があるみたいなので、詳しく知りたい人は公式ドキュメントを参考にしてください。
メールアドレス認証をするためにはカスタムユーザーの設定が必要みたいなので、その設定も追記します。
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ではデフォルトでユーザーを作成する機能がついているんだけど、どうやらそれはよろしくないみたいです。
また、ユーザーにはアドレスとパスワード、名前を設定してほしかったので今回はカスタムユーザーを作ります。
内容については下記を参考にしてください
modelが作成できたら、データベースの構築を行います。
djnagoはコマンドひとつでデータベースの構築が簡単にできちゃいます。便利。
python3 manage.py makemigrations
python3 manage.py migrate
データベースを構築後、管理ユーザーを作成します。
python3 manage.py createsuperuser
カスタムユーザーで設定したメールアドレス、名前、パスワードを入力してユーザーを作成してください。
まとめ
今回はここまでにしておきます。
あまり長いと疲れるからね
次回はURLの設定を進めていきたい
Discussion