【问题标题】:django-rest-framework-simplejwt disable refreshdjango-rest-framework-simplejwt 禁用刷新
【发布时间】:2020-05-24 18:12:37
【问题描述】:

有没有办法禁用刷新令牌?

从响应中删除刷新字段。

【问题讨论】:

    标签: django-rest-framework jwt token


    【解决方案1】:

    你可以解析 user.tokens() 字典

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

    并在响应时将它们传递给“令牌”键

    【讨论】:

      【解决方案2】:

      谢谢@alamshafi2263。我认为你给出了完美的方向。

      不知道为什么,我仍然从服务器响应中获取refresh 项,而不是 Django Shell。 (另见照片中的调试变量)。 所以我只是简单地data.pop('refresh', None) 出来,然后问题就解决了。

      感谢您的时间和代码。

      【讨论】:

        【解决方案3】:

        简单的方法

        编写一个您自己的视图来扩展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()),
        ]
        

        【讨论】:

        • 谢谢,我尝试了更好的方法,但问题仍然存在。似乎在validate() 中跳过data['refresh'] 不起作用。它返回刷新和访问,即使我删除了 data['access'] = ... 。 simplejwt=4.3.0.
        • 嘿,我试过了,它只返回serializer.validated_data中的访问令牌。您可以通过在 django shell 中运行此脚本来检查它 - gist.github.com/shafi2263/6bb24d5f17acda858ecc61dcec5a6819
        猜你喜欢
        • 2020-02-06
        • 2021-06-23
        • 2021-09-09
        • 1970-01-01
        • 2019-06-29
        • 2019-02-01
        • 2021-10-03
        • 2021-04-11
        • 2021-10-06
        相关资源
        最近更新 更多