Knox Login/Logout

Rather than using the Knox views themselves, to respect Session and GET settings, and because Knox logout signal shouldn't be triggered
This commit is contained in:
Daniel Stanton 2017-01-25 12:04:42 +00:00
parent b6c267cafc
commit 0db8c0dd95

View File

@ -24,6 +24,12 @@ from .app_settings import (
from .models import TokenModel from .models import TokenModel
from .utils import jwt_encode from .utils import jwt_encode
if getattr(settings, 'REST_USE_KNOX', False):
try:
from knox.auth import TokenAuthentication as KnoxTokenAuthentication
except ImportError:
raise ImportError("Install django-rest-knox to use REST_USE_KNOX = True")
sensitive_post_parameters_m = method_decorator( sensitive_post_parameters_m = method_decorator(
sensitive_post_parameters( sensitive_post_parameters(
'password', 'old_password', 'new_password1', 'new_password2' 'password', 'old_password', 'new_password1', 'new_password2'
@ -55,6 +61,8 @@ class LoginView(GenericAPIView):
def get_response_serializer(self): def get_response_serializer(self):
if getattr(settings, 'REST_USE_JWT', False): if getattr(settings, 'REST_USE_JWT', False):
response_serializer = JWTSerializer response_serializer = JWTSerializer
elif getattr(settings, 'REST_USE_KNOX', False):
response_serializer = KnoxTokenSerializer
else: else:
response_serializer = TokenSerializer response_serializer = TokenSerializer
return response_serializer return response_serializer
@ -81,6 +89,12 @@ class LoginView(GenericAPIView):
} }
serializer = serializer_class(instance=data, serializer = serializer_class(instance=data,
context={'request': self.request}) context={'request': self.request})
elif getattr(settings, 'REST_USE_KNOX', False):
data = {
'token': self.token
}
serializer = serializer_class(instance=data,
context={'request': self.request})
else: else:
serializer = serializer_class(instance=self.token, serializer = serializer_class(instance=self.token,
context={'request': self.request}) context={'request': self.request})
@ -103,7 +117,11 @@ class LogoutView(APIView):
Accepts/Returns nothing. Accepts/Returns nothing.
""" """
permission_classes = (AllowAny,) if getattr(settings, 'REST_USE_KNOX', False):
authentication_classes = (KnoxTokenAuthentication,)
permission_classes = (IsAuthenticated,)
else:
permission_classes = (AllowAny,)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if getattr(settings, 'ACCOUNT_LOGOUT_ON_GET', False): if getattr(settings, 'ACCOUNT_LOGOUT_ON_GET', False):
@ -117,10 +135,13 @@ class LogoutView(APIView):
return self.logout(request) return self.logout(request)
def logout(self, request): def logout(self, request):
try: if getattr(settings, 'REST_USE_KNOX', False):
request.user.auth_token.delete() request._auth.delete()
except (AttributeError, ObjectDoesNotExist): else:
pass try:
request.user.auth_token.delete()
except (AttributeError, ObjectDoesNotExist):
pass
django_logout(request) django_logout(request)