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 禁用刷新的主要内容,如果未能解决你的问题,请参考以下文章