django -rest-framework-simplejwt отключить обновление - PullRequest
1 голос
/ 09 февраля 2020

Есть ли способ отключить refre sh token?

Убрать из ответа поле refre sh.

enter image description here

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

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

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

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

enter image description here

0 голосов
/ 09 февраля 2020

The Easy Way

Напишите свое собственное представление, расширяющее 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()),
]
...