[DRF] DRF에서 JWT 기반 Authentication 세팅하기(1)

난나다·2022년 12월 14일
0

Django

목록 보기
5/5

참고

가상환경은 poetry로 진행합니다.

초기환경 세팅

패키지 설치

JWT 기반 인증을 사용하기 위해 simplejwt 패키지를 설치해줍니다.

poetry add djangorestframework
poetry add djangorestframework-simplejwt
poetry add django-allauth
poetry add dj-rest-auth

django에서 대표적으로 jwt 패키지는 djangorestframework-jwtdjangorestframework-simplejwt가 있지만 전자는 더이상 업데이트를 진행하지 않기에 후자를 사용합니다.

dj-rest-auth의 경우도 django-rest-auth에서 fork된 패키지 인데 django-rest-auth가 더이상 업데이트를 진행하지 않아 dj-rest-auth를 사용합니다.

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites', 
    #myapp
    'user',
    #django-rest-auth
    'rest_framework',
    'rest_framework_simplejwt.token_blacklist',
    'dj_rest_auth',
    'dj_rest_auth.registration',
	#django-allauth
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
]

AUTH_USER_MODEL = 'user.User'

SITE_ID = 1
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
    ),
}

DEFAULT_PERMISSION_CLASSES는 API에 접근 시에 인증된 유저, 즉 헤더에 access token을 포함하여 유효한 유저만이 접근이 가능하도록 Default로 설정합니다.

공개해야 하는 API들만 따로 설정합니다.

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_VERIFICATION = 'none'

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

REST_USE_JWT = True

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(hours=2),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,
}

마지막으로 User 모델 설정과 JWT 설정을 해줍니다.

User에서 username 필드를 사용하지 않고 email로 사용할 예정이라면 위처럼 설정해주면 됩니다. 추가적으로 email 인증을 통해 계정을 활성화시키는 방법이 있습니다.

SIMPLE_JWT에서는 access token, refresh token의 만료기간을 설정할 수 있는데, timedelta 함수로 seconds, hours, minutes, days 단위로 설정할 수 있습니다.
또한 ROTATE_REFRESH_TOKENS는 Token 재발급 관련 설정입니다.

urls.py

from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
   path('admin/', admin.site.urls),
   path('user/', include('dj_rest_auth.urls')),
   path('user/', include('dj_rest_auth.registration.urls'))
   path('user/', include('allauth.urls')),
   path('user/', include('accounts.urls')),
]

models.py

유저 설정은 블로그에 정리한 DRF에서 커스텀 유저를 사용하는 방법대로 설정하였다.

https://velog.io/@schk9611/DRF-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9C%A0%EC%A0%80-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

이후 마이그레이션을 진행한다.

python manage.py makemigrations
python manage.py migrate --run-syncdb

0개의 댓글