from rest_knox.serializers import RefreshTokenSerializer
class MyRefreshTokenSerializer(RefreshTokenSerializer):
pass
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_knox.models import AuthToken
class LogoutView(APIView):
def post(self, request, format=None):
token = request.data.get('token')
try:
token = AuthToken.objects.get(token=token)
except AuthToken.DoesNotExist:
return Response(status=status.HTTP_400_BAD_REQUEST)
token.delete()
return Response({"detail": "Successfully logged out."})
from rest_knox.serializers import LogoutSerializer
class MyLogoutSerializer(LogoutSerializer):
pass
from rest_framework import serializers
from rest_knox.serializers import TokenSerializer
class KnoxSerializerMixin(serializers.ModelSerializer):
token = TokenSerializer(read_only=True)
from .models import MyModel
from .serializers import MyModelSerializer, KnoxSerializerMixin
class MyModelSerializer(KnoxSerializerMixin, serializers.ModelSerializer):
class Meta:
model = MyModel
from rest_framework.authentication import BaseAuthentication
from rest_framework.request import Request
from rest_framework import exceptions
from rest_knox.models import AuthToken
class CustomKnoxAuthentication(BaseAuthentication):
def authenticate(self, request: Request):
token = request.headers.get('Authorization')
if not token or 'Token' not in token:
raise exceptions.AuthenticationFailed('No token provided.')
token = token.split(' ')[1]
try:
token = AuthToken.objects.get(token=token)
except AuthToken.DoesNotExist:
raise exceptions.AuthenticationFailed('Invalid token.')
return token.user, token
from rest_framework.views import APIView
from rest_framework.authentication import CustomKnoxAuthentication
from .serializers import MyModelSerializer
class MyView(APIView):
authentication_classes = (CustomKnoxAuthentication,)
def get(self, request):
user = request.user
serializer = MyModelSerializer(user)
return Response(serializer.data)
from rest_framework.permissions import BasePermission
from rest_framework.request import Request
class CustomKnoxPermission(BasePermission):
def has_permission(self, request: Request, view):
if request.user.is_authenticated:
return True
return False
from rest_framework.views import APIView
from rest_framework.permissions import CustomKnoxPermission
from .serializers import MyModelSerializer
class MyView(APIView):
permission_classes = (CustomKnoxPermission,)
def get(self, request):
user = request.user
serializer = MyModelSerializer(user)
return Response(serializer.data)
from rest_knox.models import AuthTokenManager
class MyAuthTokenManager(AuthTokenManager):
pass
from django.db import models
from rest_knox.models import AuthToken
class MyAuthToken(AuthToken):
objects = MyAuthTokenManager()
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_knox.models import AuthToken
from rest_framework.authtoken.serializers import AuthTokenSerializer
class CustomTokenObtainPairView(APIView):
def post(self, request, format=None):
serializer = AuthTokenSerializer(data=request.data)
if serializer.is_valid():
user = serializer.validated_data['user']
token, _ = AuthToken.objects.create(user)
return Response({'token': token})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# urls.py
from django.urls import path
from .views import CustomTokenObtainPairView
urlpatterns = [
path('api/token/', CustomTokenObtainPairView.as_view()),
]
from rest_framework import serializers
from rest_knox.models import AuthToken
class TokenField(serializers.ReadOnlyField):
def get_attribute(self, instance):
return AuthToken.objects.create(instance)[0]
from .models import MyModel
from .serializers import TokenField
class MyModelSerializer(serializers.ModelSerializer):
token = TokenField(source='*')
from rest_framework.serializers import Serializer
from rest_knox.serializers import TokenSerializer
class KnoxSerializerWrapper(Serializer):
token = TokenSerializer(read_only=True)
from rest_framework.viewsets import ModelViewSet
from .models import MyModel
from .serializers import KnoxSerializerWrapper
class MyViewSet(ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = KnoxSerializerWrapper
from rest_framework.permissions import BasePermission
from rest_framework.request import Request
class KnoxScopedPermission(BasePermission):
def has_permission(self, request: Request, view):
if request.user.is_authenticated and request.user.has_perm('my_app.my_perm'):
return True
return False
from rest_framework.views import APIView
from rest_framework.permissions import KnoxScopedPermission
from .serializers import MyModelSerializer
class MyView(APIView):
permission_classes = (KnoxScopedPermission,)
def get(self, request):
user = request.user
serializer = MyModelSerializer(user)
return Response(serializer.data)
from rest_knox.auth import TokenGenerator
class MyTokenGenerator(TokenGenerator):
pass
from django.db import models
from rest_knox.models import AuthToken
class MyAuthToken(AuthToken):
token_generator_class = MyTokenGenerator
from datetime import timedelta
from rest_knox.token import ExpireHandler
class MyExpireHandler(ExpireHandler):
def token_expire_time(self, request, token):
return timedelta(hours=24) # Default: timedelta(hours=8)
from django.db import models
from rest_knox.models import AuthToken
class MyAuthToken(AuthToken):
expire_handler_class = MyExpireHandler
from rest_framework import serializers
from rest_knox.serializers import UserSerializer
class KnoxUserSerializerMixin(serializers.ModelSerializer):
is_authenticated = serializers.SerializerMethodField()
def get_is_authenticated(self, obj):
return obj.is_authenticated
from .models import MyModel
from .serializers import KnoxUserSerializerMixin
class MyModelSerializer(KnoxUserSerializerMixin, serializers.ModelSerializer):
class Meta:
model = MyModel
from rest_framework.exceptions import APIException
class KnoxAPIExceptionHandler(APIException):
default_detail = 'Knox error.'
default_code = 'knox'
from rest_framework.views import APIView
from rest_framework.response import Response
from .exceptions import KnoxAPIExceptionHandler
class MyView(APIView):
def get(self, request):
raise KnoxAPIExceptionHandler()