2
votes

django-rest-framework-simplejwt désactiver le rafraîchissement

Existe-t-il un moyen de désactiver le jeton d'actualisation?

Retirez le champ de rafraîchissement de la réponse.

entrez la description de l'image ici


0 commentaires

3 Réponses :


0
votes

La manière facile

Ecrivez votre propre vue en étendant TokenObtainPairView et remplacez la méthode de 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()),
]

La manière compliquée mais plus agréable

Vous devez créer un sérialiseur étendant TokenObtainSerializer , puis définir une vue personnalisée comme ci-dessus. Cette fois, mettez votre nouveau sérialiseur comme serializer_class de cette vue et oubliez la méthode de publication.

# 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()),
]


2 commentaires

Merci, j'ai essayé la meilleure façon, mais le problème demeure. Il semble que sauter les data['refresh'] dans validate() ne fonctionne pas. Il renvoie le rafraîchissement et l'accès, même si je supprime les data['access'] = ... simplejwt = 4.3.0.


Hé, je l'ai essayé et il ne renvoie que le jeton d'accès dans le serializer.validated_data . Vous pouvez le vérifier en exécutant ce script dans votre shell django - gist.github.com/shafi2263/6bb24d5f17acda858ecc61dcec5a6819



2
votes

Merci @ alamshafi2263. Je pense que vous donnez la direction parfaite.

Je ne sais pas pourquoi, je git toujours l'élément d' refresh de la réponse du serveur, pas Django Shell. (voir également les variables de débogage sur la photo). Donc, je viens simplement de data.pop('refresh', None) , puis le problème est résolu.

Merci pour votre temps et votre code.

entrez la description de l'image ici


0 commentaires

0
votes

Vous pouvez analyser le dictionnaire user.tokens ()

user.tokens()['access']
user.tokens()['refresh]

Et passez-les à la touche "jetons" en réponse


0 commentaires