views.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from rest_framework import generics, status
  2. from rest_framework.response import Response
  3. from . import serializers
  4. from .authentication import AUTH_HEADER_TYPES
  5. from .exceptions import InvalidToken, TokenError
  6. class TokenViewBase(generics.GenericAPIView):
  7. permission_classes = ()
  8. authentication_classes = ()
  9. serializer_class = None
  10. www_authenticate_realm = 'api'
  11. def get_authenticate_header(self, request):
  12. return '{0} realm="{1}"'.format(
  13. AUTH_HEADER_TYPES[0],
  14. self.www_authenticate_realm,
  15. )
  16. def post(self, request, *args, **kwargs):
  17. serializer = self.get_serializer(data=request.data)
  18. try:
  19. serializer.is_valid(raise_exception=True)
  20. except TokenError as e:
  21. raise InvalidToken(e.args[0])
  22. return Response(serializer.validated_data, status=status.HTTP_200_OK)
  23. class TokenObtainPairView(TokenViewBase):
  24. """
  25. Takes a set of user credentials and returns an access and refresh JSON web
  26. token pair to prove the authentication of those credentials.
  27. """
  28. serializer_class = serializers.TokenObtainPairSerializer
  29. token_obtain_pair = TokenObtainPairView.as_view()
  30. class TokenRefreshView(TokenViewBase):
  31. """
  32. Takes a refresh type JSON web token and returns an access type JSON web
  33. token if the refresh token is valid.
  34. """
  35. serializer_class = serializers.TokenRefreshSerializer
  36. token_refresh = TokenRefreshView.as_view()
  37. class TokenObtainSlidingView(TokenViewBase):
  38. """
  39. Takes a set of user credentials and returns a sliding JSON web token to
  40. prove the authentication of those credentials.
  41. """
  42. serializer_class = serializers.TokenObtainSlidingSerializer
  43. token_obtain_sliding = TokenObtainSlidingView.as_view()
  44. class TokenRefreshSlidingView(TokenViewBase):
  45. """
  46. Takes a sliding JSON web token and returns a new, refreshed version if the
  47. token's refresh period has not expired.
  48. """
  49. serializer_class = serializers.TokenRefreshSlidingSerializer
  50. token_refresh_sliding = TokenRefreshSlidingView.as_view()
  51. class TokenVerifyView(TokenViewBase):
  52. """
  53. Takes a token and indicates if it is valid. This view provides no
  54. information about a token's fitness for a particular use.
  55. """
  56. serializer_class = serializers.TokenVerifySerializer
  57. token_verify = TokenVerifyView.as_view()