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 单元测试说“未提供身份验证”

Django Rest Framework 避免身份验证 JWT

如何让 django-rest-framework-jwt 在注册时返回令牌?