Django Rest Framework JWT:如何更改令牌过期消息
Posted
技术标签:
【中文标题】Django Rest Framework JWT:如何更改令牌过期消息【英文标题】:Django Rest Framework JWT: How to change token expiration message 【发布时间】:2021-03-10 03:28:36 【问题描述】:当我发送的 JWT 令牌过期时,我会收到此消息...
"detail": "Signature has expired."
现在,我想用我的自定义消息更改响应,例如...
"message": "token has expired.",
"data": null,
"status": 401
我尝试在 APIView 中这样做,但它不起作用。
【问题讨论】:
使用 django-rest-framework-simplejwt 而不是 django-rest-framework-jwt,因为它已被弃用 【参考方案1】:这是我为我的项目所做的。 我猜这不是最好的解决方案。但它工作正常。
-
创建您自己的序列化程序。
从 JSONWebTokenAPIView 子类化您的视图。
然后将您想要的任何属性添加到您的响应中,自定义响应消息等
查看代码。
# serializer
class TokenSerializer(serializers.Serializer):
token = serializers.CharField()
# viewset
from rest_framework_jwt.utils import (
jwt_decode_handler,
jwt_get_username_from_payload_handler,
)
class VerifyLoginTokenAPIView(JSONWebTokenAPIView):
serializer_class = TokenSerializer
permission_classes = [AllowAny]
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
if not serializer.is_valid():
return Response(
"success": False, "message": "token Invalid",
status=status.HTTP_406_NOT_ACCEPTABLE,
)
token = serializer.data.get("token")
message = None
try:
payload = jwt_decode_handler(token)
except Exception:
payload = None
message = "Invalid or expired token" # --> Your customized response message
if payload:
username = jwt_get_username_from_payload_handler(payload)
if username:
try:
user = User.objects.get_by_natural_key(username)
except User.DoesNotExist:
user = None
else:
return Response(
"success": True, "message": "token": token, "user": user.id,
status=status.HTTP_200_OK,
)
message = "No User found"
return Response(
"success": False, "message": message,
status=status.HTTP_200_OK,
) # --> your customized response
【讨论】:
问题是我使用标头而不是正文发送令牌,请求正文也有数据,如果它是 POST 并且它是特定于 API 的。您是否知道使用标头进行操作,例如它会在访问 API 之前检查令牌。我也准备好使用任何抽象类来做到这一点。 我也有类似“AllowAny”的想法,并使用 APIView 中的条件检查标头中的令牌。但它很长而且我有很多 API 来应用这个过程。 :( 我的项目我使用了 AllowAny,你可以为你的项目使用 IsAuthenticated。这样如果用户通过身份验证,那么它将继续使用 api。这是你要找的吗?以上是关于Django Rest Framework JWT:如何更改令牌过期消息的主要内容,如果未能解决你的问题,请参考以下文章
DRF:如何将 django-rest-framework-jwt 集成到 Djoser
Django Rest Framework 中的 JWT 身份验证错误“无效签名”
Django Rest Framework JWT 身份验证测试
Django-Rest-Framework JWT 单元测试说“未提供身份验证”