DRF를 이용하여 JWT 토큰을 발급받는 방법과 간단한 사용예시에 관하여 정리해보고자 합니다.
저는 새로 django 프로젝트를 생성하여 진행하였습니다.
pip install djangorestframework
# &&
pip install djangorestframework-jwt
# &&
python manage.py startapp accounts
# &&
python manage.py createsuperuser
두 패키지를 pip를 통해 설치 및 앱 생성, superuser 생성을 진행하여 줍니다.
이후에 settings의 INSTALLED_APPS에 추가하여 줍시다.
INSTALLED_APPS = [
# 생략 ....
'accounts', # 유저 모델을 정의할 앱 생성
'rest_framework',
]
accounts/Models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
settings.py
AUTH_USER_MODEL = 'accounts.User' # 추가
여기까지 코드를 작성하신 이후 마이그레이션을 진행합니다 !
python manage.py makemigrations accounts
# &&
python manage.py migrate
accounts/serializers.py
from rest_framework import serializers
from django.contrib.auth import get_user_model
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ['id', 'username', 'first_name', 'last_name', 'email']
accounts/views.py
from rest_framework.viewsets import ModelViewSet
from django.contrib.auth import get_user_model
from .serializers import UserSerializer
User = get_user_model()
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
accounts/urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]
config/urls.py (프로젝트 루트)
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('accounts/', include('accounts.urls')),
]
코드 작성 후 서버를 실행하여 http://localhost:8000/accounts/users/로 접속하여 보면 User API 페이지가 나타납니다.
User API를 생성하였으니, JWT 토큰을 발급 받아야 합니다.
settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
JWT_AUTH = {
'JWT_SECRET_KEY': SECRET_KEY,
'JWT_ALGORITHM': 'HS256',
'JWT_ALLOW_REFRESH': True,
'JWT_EXPIRATION_DELTA': timedelta(days=7),
'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=28)
}
기본적인 REST_FRAMEWORK의 permission과 authentication의 세팅입니다.
'rest_framework_jwt.authentication.JSONWebTokenAuthentication' 부분이 추가되어야 jwt 토큰 인증 방식을 사용하실 수 있습니다.
JWT_AUTH 부분은 위의 항목들 외에도 옵션이 더 많은데, 필요한 부분들만 간추려 봤습니다 !
accounts/urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from rest_framework_jwt.views import obtain_jwt_token
from rest_framework_jwt.views import refresh_jwt_token
from rest_framework_jwt.views import verify_jwt_token
from . import views
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
path('', include(router.urls)),
path('token/', obtain_jwt_token),
path('token/refresh', refresh_jwt_token),
path('token/verify', verify_jwt_token),
]
token 관련한 function들과 url을 정의하여 줍니다.
http://localhost:8000/accounts/token/로 접속하면
Username과 Password를 입력할 수 있는 양식과 함께, JWT 토큰을 발급 받을 수 있는 페이지가 나옵니다.
생성한 유저의 Username과 Password를 입력하여 주면 토큰이 생성됩니다.
이로써 JWT 토큰을 이용하여 API 페이지로의 접근이 가능하게 되었습니다.
Postman을 통해서 토큰을 활용해보겠습니다.
인증 되지 않은 사용자의 요청이라 , 데이터로의 접근이 허용되지 않고 있습니다.
Headers에 발급받은 토큰과 함께 , 다시 요청을 보내면 ..
생성한 유저들의 정보가 담긴 응답을 잘 받고 있네요.
djangorestframework-jwt의 관한 자세한 내용은 https://jpadilla.github.io/django-rest-framework-jwt/ 문서를 통해 확인해 보실 수 있습니다.
'아카이브' 카테고리의 다른 글
200527 / TIL (0) | 2020.05.27 |
---|---|
200526 / TIL (0) | 2020.05.26 |
200525 / TIL (0) | 2020.05.25 |
백준 1924번 / 2007년 (Python, 파이썬, 백준, 알고리즘) (0) | 2020.05.25 |
프로그래머스 / 타겟 넘버 (Python, 파이썬, 알고리즘) (0) | 2020.05.25 |