Source code for jwt_allauth.logout.views
from django.utils.translation import gettext_lazy as _
from django.conf import settings
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
from jwt_allauth.logout.serializers import RemoveRefreshTokenSerializer
from jwt_allauth.tokens.models import RefreshTokenWhitelistModel
from jwt_allauth.constants import REFRESH_TOKEN_COOKIE
[docs]
class LogoutView(APIView):
"""
Calls Django logout method and delete the Token object
assigned to the current User object.
Accepts/Returns nothing.
"""
permission_classes = (IsAuthenticated,)
[docs]
def get(self, request, *args, **kwargs):
return self.http_method_not_allowed(request, *args, **kwargs)
[docs]
def post(self, request):
return self.logout(request)
[docs]
@staticmethod
def logout(request):
data = request.data.copy()
if getattr(settings, 'JWT_ALLAUTH_REFRESH_TOKEN_AS_COOKIE', False):
refresh_token = request.COOKIES.get(REFRESH_TOKEN_COOKIE)
if refresh_token:
data['refresh'] = refresh_token
else:
return Response(
{"detail": _("Refresh token cookie not found.")},
status=status.HTTP_400_BAD_REQUEST
)
try:
RemoveRefreshTokenSerializer(
data=data,
context={'user': request.user.id}
).is_valid(raise_exception=True)
return Response(
{"detail": _("Successfully logged out.")},
status=status.HTTP_200_OK
)
except (TokenError, InvalidToken):
return Response(
{"detail": _("Invalid token.")},
status=status.HTTP_400_BAD_REQUEST
)
[docs]
class LogoutAllView(APIView):
"""
Logout from all devices.
Accepts/Returns nothing.
"""
permission_classes = (IsAuthenticated,)
[docs]
def get(self, request, *args, **kwargs):
return self.http_method_not_allowed(request, *args, **kwargs)
[docs]
def post(self, request):
return self.logout(request)
[docs]
@staticmethod
def logout(request):
RefreshTokenWhitelistModel.objects.filter(user=request.user.id).delete()
return Response(
{"detail": _("Successfully logged out from all devices.")},
status=status.HTTP_200_OK
)