가상환경은 poetry로 진행합니다.
JWT 기반 인증을 사용하기 위해 simplejwt
패키지를 설치해줍니다.
poetry add djangorestframework
poetry add djangorestframework-simplejwt
poetry add django-allauth
poetry add dj-rest-auth
django에서 대표적으로 jwt 패키지는 djangorestframework-jwt
와 djangorestframework-simplejwt
가 있지만 전자는 더이상 업데이트를 진행하지 않기에 후자를 사용합니다.
dj-rest-auth
의 경우도 django-rest-auth
에서 fork된 패키지 인데 django-rest-auth
가 더이상 업데이트를 진행하지 않아 dj-rest-auth
를 사용합니다.
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 재발급 관련 설정입니다.
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')),
]
유저 설정은 블로그에 정리한 DRF에서 커스텀 유저를 사용하는 방법대로 설정하였다.
이후 마이그레이션을 진행한다.
python manage.py makemigrations
python manage.py migrate --run-syncdb