Django로 프로젝트를 진행하면서 User 작업은 피할 수 없다. 사실 혼자 데베 프젝을 하면서 jwt 토큰을 이용하여 회원관리를 구현한 적이 있었는데, 데베와 연동을 하다보니 오류를 고치는 데에만 몇 시간이 걸렸다.. (물론 이번에도 마찬가지 였지만..)
그 때는 DB로 생성한 user 테이블을 이용하여 기능을 구현했는데 그러다 보니 필드가 서로 맞지 않아 생기는 오류가 너무 많았다. 그래서 이번엔 user custom을 통해 좀 더 디테일하게 만들었다.
1. 라이브러리 설치
pip install djangorestframwork
pip install djangorestframework-simplejwt
djangorestframework-jwt 라이브러리가 더이상 업데이트 되지 않아 DRF 공식 문서는 simplejwt 라이브러리 사용을 권장하고 있다.
settings.py
#user 설정
AUTH_USER_MODEL = 'accounts.User'
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#라이브러리
'rest_framework',
'rest_framework_simplejwt',
'rest_framework.authtoken',
#앱 (accounts 앱에서 기능 구현)
'usebody.apps.UsebodyConfig',
'accounts.apps.AccountsConfig',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
#JWT 설정
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'AUTH_HEADER_TYPES': ('JWT',),
}
accounts 앱에서 User를 관리(회원가입, 로그인, 로그아웃..)할 것이기 때문에 accounts 앱을 생성하고 user를 accounts의 user로 설정을 해준다.
SIMPLE_JWT 부분에는 JWT를 설정해주면 되는데 나는 기본적인 것들만 설정을 해두었다.
더 많은 설정을 보기 위해서는 https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html 참고!
2. User Custom
Django가 제공하는 기본 User model은 username, email, password 등의 필드를 가지고 있다. 하지만, 내가 진행하는 프로젝트에서는 username이 아닌 nickname 필드가 필요하고, email 주소를 통해 로그인 한다.
그렇기 때문에 user를 필요한 대로 custom 해주어야 한다.
<필요한 필드>
- nickname : user의 닉네임
- email : 로그인 시 email로 로그인
- password : 비밀번호 (암호화 필요)
accounts/models.py
from django.contrib.auth.base_user import BaseUserManager
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
# 헬퍼 클래스
class UserManager(BaseUserManager):
def create_user(self, email, nickname, password, **kwargs):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
nickname=nickname
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email=None, nickname=None, password=None):
superuser = self.create_user(
email=email,
nickname=nickname,
password=password,
)
superuser.is_staff = True
superuser.is_superuser = True
superuser.is_active = True
superuser.save(using=self._db)
return superuser
# 커스텀 유저 모델
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
email = models.EmailField(max_length=100, blank=False, null=False, unique=True)
# 닉네임 필드 추가
nickname = models.CharField(max_length=20, blank=False, null=False, unique=True)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# email로 로그인 할 것이기 때문에 username 필드를 email로 설정
USERNAME_FIELD = 'email'
# 회원가입 시 nickname을 입력해야 하기 때문에 required field에 추가
REQUIRED_FIELDS = ['nickname']
커스텀 유저 모델을 만들기 위해서는 (BaseUserManager, AbstractBaseUser) 두 클래스가 필요하다.
BaseUserManager : User를 생성할 때 사용하는 헬퍼 클래스
AbstractBaseUser: 로그인 방식 변경, 원하는 필드로 User 모델을 구성
위의 코드에서 헬퍼 클래스인 class UserManager(BaseUserManager)는 2개의 함수를 포함한다.
- create_user(*username_field*, password, **other_fields) : user model 생성
- create_superuser(*username_field*, password, **other_fields) : 관리자 user model 생성
username 대신에 email을, 그리고 추가로 nickname 필드를 추가할 것이기 때문에
def create_user(self, email, nickname, password, **kwargs):
이렇게 함수를 만들었다.
3. Serializer
accounts/serializers.py
from rest_framework import serializers
from accounts.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
def create(self, validated_data):
user = User.objects.create_user(
email=validated_data['email'],
nickname=validated_data['nickname'],
password=validated_data['password']
)
return user
유효한 데이터를 입력 받으면 user 객체를 생성한다.
커스텀한 유저를 이용한 회원가입 구현은 다음편에서...
<참고>
- 커스텀 유저 모델
AbstractBaseUser를 활용한 Django 커스텀 유저 모델 만들기
Django는 기본적으로 django.contrib.auth.models에 포함된 User 모델을 제공합니다. 내장으로 permission이나 authentication 등 다양한 기능을 제공해주는 훌륭한 모델이지만 이 User 모델은 아래와 같이 굳이 필
velog.io
- 유저 모델
[Django Authentication System의 모든 것] #1 - 기본 User 모델
소개 *해당 시리즈는 독자 분들이 장고에 대한 기본 지식 (장고 어드민, 장고 기본 로그인 구축 등)을 가지고 계시다는 가정 하에 작성된 글입니다. 장고 자체를 전혀 사용해보시지 않으신 분들
velog.io
- 회원관리
[DRF] JWT 인증을 사용한 회원가입&로그인
작년에 멋사에서 이음 프로젝트를 하면서 가장 절실하게 깨달았던 점.. 유저는 무조건 시작단계에 해놔야 한다. 다른거 다 만들고 유저를 만들거나 고치려고 하면 너무 복잡하게 얽혀있어서 공
velog.io
'Django' 카테고리의 다른 글
| [Python] package 목록 관리 (requirements.txt) (6) | 2023.10.05 |
|---|---|
| [Python] 가상 환경이란? (Virtual Environment) (1) | 2023.10.05 |
| [Django] DRF JWT 인증 방식을 이용한 회원가입 & 로그인 (3. 이메일 로그인/로그아웃) (4) | 2023.09.01 |
| [Django] DRF JWT 인증 방식을 이용한 회원가입 & 로그인 (2. 이메일 회원가입) (3) | 2023.08.18 |
| Django - mariaDB (MySQL) 연동하기 (3) | 2023.07.26 |