본문 바로가기
아카이브

Django - DRF를 이용한 JWT 토큰 발급받기

by PilYeooong 2020. 5. 26.

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