django-rest-framework-simplejwt 禁用刷新

Posted

技术标签:

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

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

从响应中删除刷新字段。

【问题讨论】:

【参考方案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

以上是关于django-rest-framework-simplejwt 禁用刷新的主要内容,如果未能解决你的问题,请参考以下文章