Есть ли способ отключить обновление токена?

Уберите поле обновления из ответа.

enter image description here

1
C.K. 9 Фев 2020 в 06:37

2 ответа

Лучший ответ

Спасибо @ alamshafi2263. Я думаю, что вы даете идеальное направление.

Не знаю почему, я все еще получил элемент refresh из ответа сервера, а не из Django Shell. (также см. переменные отладки на фото). Так что я просто data.pop('refresh', None) это выяснил, и проблема решена.

Спасибо за ваше время и код.

enter image description here

1
C.K. 23 Фев 2020 в 22:26

Легкий путь

Напишите собственное представление, расширяющее TokenObtainPairView и переопределите метод post.

# in your views.py

from rest_framework import status
from rest_framework.response import Response
from rest_framework_simplejwt.views import TokenObtainPairView


class MyTokenView(TokenObtainPairView):
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        try:
            serializer.is_valid(raise_exception=True)
        except TokenError as e:
            raise InvalidToken(e.args[0])
        serializer.validated_data.pop('refresh', None)
        return Response(serializer.validated_data, status=status.HTTP_200_OK)

# in your urls.py
urlpatterns = [
    path('api/token/', MyTokenView.as_view()),
]

Сложный, но более приятный путь

Вам необходимо создать сериализатор, расширяющий TokenObtainSerializer, а затем определить пользовательское представление, как указано выше. На этот раз поместите ваш новый сериализатор в качестве serializer_class этого представления и забудьте о методе post.


# in your serializers.py
from rest_framework_simplejwt.serializers import TokenObtainSerializer
from rest_framework_simplejwt.tokens import RefreshToken

class MyTokenObtainSerializer(TokenObtainSerializer):
    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        data['access'] = str(refresh.access_token)

        return data


# in your views.py
from rest_framework_simplejwt.views import TokenObtainPairView

from .serializers import MyTokenObtainSerializer

class MyTokenView(TokenObtainPairView):
    serializer_class = MyTokenObtainSerializer

# in your urls.py
urlpatterns = [
    path('api/token/', MyTokenView.as_view()),
]
0
alamshafi2263 9 Фев 2020 в 05:21