[DRF] dj-rest-auth를 활용한 (아주 간편한) JWT 회원가입/로그인

김재연·2022년 7월 22일
6

Watti

목록 보기
6/10
post-thumbnail

지난번에는 회원가입과 로그인 코드를 하나하나 짰는데 이메일 인증을 하려고 보니.. 그냥 dj-rest-auth로 빨리 갈아타는게 정신건강에 좋을 것 같아서 갈아탔다.

전에 views.pyserializers.py에서 열심히 썼던거는 그냥 다 날려버렸고,

패키지는 이전에 설치해둔거 그대로 사용.

djangorestframework, djangorestframework-simplejwt, dj-rest-auth, allauth

변경한 코드

urls.py

url만 이렇게 추가해주면 된다. 사용할 view 마다 따로 추가해도 되기는 한데 굳이..? 싶어서 몽땅 추가.

# urls.py

urlpatterns = [
	...
    # 일반 회원 회원가입/로그인
    path('dj-rest-auth/', include('dj_rest_auth.urls')),
    path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls'))
]

그러면 접근 가능한 url이 이렇게 늘어난다.

로그인, 회원가입에 로그아웃, 유저정보, 비밀번호 변경 및 초기화, 토큰 재발급까지 호로록 들어온다. 🐶🍯

settings.py

그리고 registration의 경우에는 이메일 인증이 자동으로 활성화되어 있어서 (아직 안쓸거니까) settings.py에 아래 한 줄을 추가해줬다.

# settings.py
ACCOUNT_EMAIL_VERIFICATION = 'none'

하나하나 썼던걸 지우면서 가장 최소한으로 필요한게 뭔지 찾아봤는데, 정확하진 않지만 최소한 아래에 있는 것들은 없애면 오류가 났다.

# settings.py

AUTH_USER_MODEL = 'user.User'

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    'rest_framework_simplejwt',
    'dj_rest_auth',
    'dj_rest_auth.registration',

    'allauth',
    'allauth.account',
    ...
]

SITE_ID = 1
REST_USE_JWT = True
ACCOUNT_USER_MODEL_USERNAME_FIELD = None # username 필드 사용 x
ACCOUNT_EMAIL_REQUIRED = True            # email 필드 사용 o
ACCOUNT_USERNAME_REQUIRED = False        # username 필드 사용 x
ACCOUNT_AUTHENTICATION_METHOD = 'email'

ACCOUNT_EMAIL_VERIFICATION = 'none' # 회원가입 과정에서 이메일 인증 사용 X

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    ...
}

simple-jwt를 안쓰는 것 같아서 이걸 지우려고 했더니 그건 또.. 아닌가봄? 그래서 살려뒀다.

models.py

# models.py

class UserManager(BaseUserManager):

    def create_user(self, email, password, **kwargs):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=email,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email=None, password=None, **extra_fields):
        superuser = self.create_user(
            email=email,
            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):
    
    email = models.EmailField(max_length=30, unique=True, null=False, blank=False)
    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)

    objects = UserManager()

    USERNAME_FIELD = 'email'

유저 모델만 남기고 UserManager는 지우려고 했는데 내가 username을 email로 쓴다고 했기 때문에 커스텀된 헬퍼클래스가 필요한가보다. 그냥 유저 생성은 됐는데 createsuperuser에서 자꾸 오류가 났음. 그래서 또 살려둠.

테스트

- 관리자계정

- 일반유저 회원가입

- 일반유저 로그인

- 일반유저 정보 (소셜로그인 유저도 가능)

- 일반유저 로그아웃

음..뭐..응..그래

- 일반유저 비밀번호 변경

- 일반유저 토큰 재발급

개편하네

profile
일기장같은 공부기록📝

4개의 댓글

comment-user-thumbnail
2023년 7월 25일

혹시 views.py를 아예 쓰지 않고 사용한 것 인걸까요....?

1개의 답글