1. JWT, RestFrameWork, RestAuth 설치

pip install djangorestframework
pip install djangorestframework-jwt
pip install django-rest-auth
pip install django-allauth

 

2. Settings.py 수정

INTALLED_APPS에 아래 내용을 추가합니다.

INSTALLED_APPS = [
    ...
    'accounts',
    'rest_framework',
    'rest_framework.authtoken',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',
]

"accounts"는 제가 만든 앱 이름이므로 각각의 앱명에 맞게 입력해주세요.

 

REST_FRAMEWORK의 내용도 맨하단에 추가해줍니다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        #'rest_framework.authentication.SessionAuthentication',
        #'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ]
}

"DEFADEFAULT_PERMISSION_CLASSES" 이 부분은 Default 퍼미션을 정의하는 부분으로 내용은 아래와 같습니다.

IsAuthenticatedOrReadOnly -> 인증된 사용자는 허용, 나머지 읽기만 가능 

IsAuthenticated ->인증된 사용자는 허용

IsAdminUser -> 관리자만 허용

AllowAny -> 모두 허용

 

우리는 인증에 JWT Token을 사용할 것이기 때문에 위의  "DEFAULT_AUTHENTICATION_CLASSES" 내부의 

'rest_framework.authentication.SessionAuthentication',

'rest_framework.authentication.BasicAuthentication',

이 두분을 주석처리합니다.

 

JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
        'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
        'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
        'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
        'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
        'rest_framework_jwt.utils.jwt_response_payload_handler',

    'JWT_SECRET_KEY': 'SECRET_KEY',
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': timedelta(minutes=1),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': False,
    'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30),

    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    'JWT_AUTH_COOKIE': None,
}

#ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_REQUIRED = False

#ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_EMAIL_VERIFICATION = "none"

REST_USE_JWT = True
ACCOUNT_LOGOUT_ON_GET = True

또한 윗부분을 추가합니다.

이 부부은 토큰의 알고리즘, 유효기간, 등을 설정하는 부분으로 가장 중요한 "JWT_EXPIRATION_DELTA" 토큰 만료기간을 "minutes", "hours", "weeks" 등으로 설정할 수 있습니다.

자세한 내용은 jpadilla.github.io/django-rest-framework-jwt/ 여기를 참고하시기 바랍니다.

 

3. project/urls.py 수정

from django.contrib import admin
from django.urls import path, re_path
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('accounts.urls')),
    re_path(r'^rest-auth/', include('rest_auth.urls')),
    re_path(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
]

위와 같이 설정해줍니다.

 

 

4. accounts/urls.py 작성

from django.urls import path

from . import views

urlpatterns = [
   
    path('', views.index),
]

인증 테스트를 진행할 경로를 지정합니다.

 

5. accounts/views.py

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny, IsAuthenticated
from django.http import HttpResponse

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def index(request):
    return HttpResponse('hello')

위코드는 단순히 'hello'라는 문자열을 http로 리턴해주는 코드입니다.

여기서 중요한부분은 "@permission_classes([IsAuthenticated])" 이 부분입니다.

위 부분은 퍼미션을 결정하는 부분으로 "AllowAny"로 지정할 경우 모든 사용자가 접근이 가능하며 위와 같이 "IsAuthenticated"로 지정하면 인증된 사용자만 접근이 가능합니다.

 

6. POSTMAN 테스트

[회원가입]

위와 같이 회원가입을 진행하면 Token이 발급됩니다.

 

[로그인]

로그인도 마찬가지로 Token이 발급되며 사용자 정보를 리턴합니다.

 

[로그아웃]

토큰을 위와 같이 Prefix와 함께 헤더에 적어주면 로그아웃이 됩니다.

 

현재 토큰만료시간이 1분으로 설정되어 있기 때문에 혹시 위와같이 진행이 되지 않는 경우 setting.py의 "JWT_EXPIRATION_DELTA" 옵션을 조정하기 바랍니다.

 

[인증 테스트]

저는 "python manage.py runserver 0.0.0.0:8010"을 사용하여 기동하였습니다.

 

- 로그인을 했을 경우

"http://localhost:8000/accounts/" 접속

정상적으로 "hello"문자열이 출력됩니다.

 

- 로그인을 하지 않았을 경우 

- 토큰이 만료되었을 경우

 

이후 적용 또는 변경되는 사항은 추후에 또 올리겠습니다 ~

+ Recent posts