Notice
Recent Posts
Recent Comments
Link
Ssul's Blog
[Django] username대신, email 사용하기, jwt로그인 1 본문
장고의 user는 username을 기본으로 사용한다. 하지만, 요즘 회원가입/로그인은 소셜로그인 또는 email임.
그럼 선택의 기로에 선다.
쌩으로 user 모델 만들기 vs 장고 user상속후 만들기
이후 인증 등 다양한 내용을 구축하기에는 장고의 User를 상속받는 것이 맞는 것 같다.
그래서, User를 상속받되, email을 메인으로 사용하는 형태로 구현.
1. BaseUserManager 수정: 수정 안해도 되지만, 이후 관리자모드 사용하기에 피곤하지 않으려면, BaseUserManager부터 수정하자
class CustomUserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifiers
for authentication instead of usernames.
"""
def create_user(self, email, password, **extra_fields):
"""
Create and save a User with the given email and password.
"""
if not email:
raise ValueError(_('The Email must be set'))
email = self.normalize_email(email)
#user생성시, email로 생성
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, 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.'))
#슈퍼유저(관리자)도 username이 아닌, email로 생성
return self.create_user(email, password, **extra_fields)
2. User생성시, 장고의 AbstractUser상속받아서, email사용, username 미사용으로 셋팅
class User(AbstractUser):
# abstractUser 기본필드 비활성화
first_name = None # first_name 필드 비활성화
last_name = None # last_name 필드 비활성화
username = None #username필드 비활성화
# password는 AbstractUser로 사용
email = models.EmailField(unique=True)
nickname = models.CharField(max_length=255, verbose_name='닉네임')
biz_message_phone_number = models.CharField(max_length=255, verbose_name='비즈메시지 수신 휴대폰번호')
# 서비스에서 필요한 User내용 넣기
# USERNAME_FIELD는 사용자를 식별하는 데 사용되는 필드,
USERNAME_FIELD = "email"
EMAIL_FIELD = "email"
# REQUIRED_FIELDS는 createsuperuser 관리 명령어 실행 시 필요한 필드 목록
# 나는 미입력했으므로, email과 password만 필요
REQUIRED_FIELDS = []
#위에서 만든 커스텀유저매니저 연결
objects = CustomUserManager()
3. 로그인 구현 기획
로그인 구현은 쿠키, 세션, 토큰 방식.
쿠키, 세션은 많이 해봤으니, 토큰 방식으로 결정.
djangorestframework-simplejwt 사용하기
4. djangorestframework-simplejwt 셋팅
pip install djangorestframework-simplejwt
#settings.py
INSTALLED_APPS = [
...
'rest_framework_simplejwt.token_blacklist',
]
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
# 리프레쉬 토큰 발급시 새로운것으로 할지?
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
...
}
'dev > 기능구현' 카테고리의 다른 글
Youtube 영상 정보/자막 정보 추출방법 (2) | 2024.01.12 |
---|---|
[Django] username대신, email 사용하기, jwt로그인 2 (1) | 2023.12.19 |
소셜로그인 구현 - apple 로그인 (0) | 2023.06.28 |
restframework-simplejwt 사용하기 (0) | 2023.04.19 |
React Native IOS배포하기 (0) | 2023.02.28 |