From 2ed696f90fc9428531768967de0e1fbce9551a8d Mon Sep 17 00:00:00 2001 From: annisadevin <adevi.nurmalasari@gmail.com> Date: Sun, 1 May 2022 10:37:57 +0700 Subject: [PATCH] Menambahkan view dan serializer logout --- auth_remindme/settings.py | 12 ++++++++---- oauth/serializers.py | 3 +++ oauth/urls.py | 1 + oauth/views.py | 25 ++++++++++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/auth_remindme/settings.py b/auth_remindme/settings.py index 3b79de8..9ed7288 100644 --- a/auth_remindme/settings.py +++ b/auth_remindme/settings.py @@ -58,6 +58,7 @@ INSTALLED_APPS = [ 'main', 'oauth', 'rest_framework_simplejwt', + 'rest_framework_simplejwt.token_blacklist', ] MIDDLEWARE = [ @@ -170,7 +171,10 @@ STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', - ) + ), + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ), } AUTH_USER_MODEL = "oauth.UserAccount" @@ -178,9 +182,9 @@ AUTH_USER_MODEL = "oauth.UserAccount" SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), - 'ROTATE_REFRESH_TOKENS': False, - 'BLACKLIST_AFTER_ROTATION': False, - 'UPDATE_LAST_LOGIN': False, + 'ROTATE_REFRESH_TOKENS': True, + 'BLACKLIST_AFTER_ROTATION': True, + 'UPDATE_LAST_LOGIN': True, 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, diff --git a/oauth/serializers.py b/oauth/serializers.py index 221d266..5b3ed9e 100644 --- a/oauth/serializers.py +++ b/oauth/serializers.py @@ -20,3 +20,6 @@ class UserSerializer(serializers.ModelSerializer): return instance except Exception as err: raise err + +class LogoutSerializer(serializers.Serializer): + refresh_token = serializers.CharField() \ No newline at end of file diff --git a/oauth/urls.py b/oauth/urls.py index acff786..8d843f9 100644 --- a/oauth/urls.py +++ b/oauth/urls.py @@ -14,4 +14,5 @@ urlpatterns = [ path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'), path('api/create-user/', views.UserCreate.as_view()), path('api/resource/', views.ResourceTest.as_view()), + path('api/logout/', views.Logout.as_view()), ] diff --git a/oauth/views.py b/oauth/views.py index 8b5146c..18b8deb 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -1,9 +1,8 @@ from rest_framework import generics from rest_framework.exceptions import ValidationError -from rest_framework.response import Response -from rest_framework.views import APIView +from rest_framework_simplejwt.tokens import RefreshToken from .models import UserAccount -from .serializers import UserSerializer +from .serializers import LogoutSerializer, UserSerializer from rest_framework.permissions import AllowAny, IsAuthenticated from djangorestframework_camel_case.parser import (CamelCaseJSONParser, CamelCaseMultiPartParser, @@ -29,6 +28,22 @@ class UserCreate(generics.CreateAPIView): class ResourceTest(generics.ListAPIView): queryset = UserAccount.objects.all() serializer_class = UserSerializer - permission_classes = [AllowAny] + permission_classes = [IsAuthenticated] parser_classes = (CamelCaseJSONParser, CamelCaseFormParser, CamelCaseMultiPartParser, ) - renderer_classes = (CamelCaseJSONRenderer, CamelCaseBrowsableAPIRenderer, ) \ No newline at end of file + renderer_classes = (CamelCaseJSONRenderer, CamelCaseBrowsableAPIRenderer, ) + +# Antara pakai logout ini atau langsung di react +class Logout(generics.CreateAPIView): + serializer_class = LogoutSerializer + permission_classes = [IsAuthenticated] + parser_classes = (CamelCaseJSONParser, CamelCaseFormParser, CamelCaseMultiPartParser, ) + renderer_classes = (CamelCaseJSONRenderer, CamelCaseBrowsableAPIRenderer, ) + + def perform_create(self, request): + try: + refresh_token = request.data["refresh_token"] + token = RefreshToken(refresh_token) + token.blacklist() + except Exception as err: + error_message = {'error': err} + raise ValidationError(error_message) -- GitLab