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"문자열이 출력됩니다.
- 로그인을 하지 않았을 경우
- 토큰이 만료되었을 경우
이후 적용 또는 변경되는 사항은 추후에 또 올리겠습니다 ~
'프로그래밍 > Django' 카테고리의 다른 글
[Django] 11. Ajax를 이용한 파일 업로드 기능 구현 (705) | 2023.09.15 |
---|---|
[Django] 10. Custom User Model 구현( Serializer, Adapter) (721) | 2021.01.15 |
[Django] 8. Mariadb / Mysql DB 연동(데이터베이스) (717) | 2020.12.23 |
[Django] 7. 파라미터 전송(정규표현식, URL 페이지 번호) (711) | 2020.12.16 |
[Django] 6. 파라미터 전송(GET, POST) (714) | 2020.12.15 |