【问题标题】:Django Rest Framework JWT: How to change token expiration messageDjango Rest Framework JWT:如何更改令牌过期消息
【发布时间】: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,因为它已被弃用

标签: python django django-rest-framework jwt django-rest-framework-jwt


【解决方案1】:

这是我为我的项目所做的。 我猜这不是最好的解决方案。但它工作正常。

  1. 创建您自己的序列化程序。
  2. 从 JSONWebTokenAPIView 子类化您的视图。
  3. 然后将您想要的任何属性添加到您的响应中,自定义响应消息等 查看代码。
# 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。这是你要找的吗?
猜你喜欢
  • 2017-10-02
  • 2019-08-01
  • 2019-06-20
  • 2016-08-24
  • 2017-06-25
  • 2015-05-12
  • 2017-03-30
  • 2020-11-02
  • 2015-09-17
相关资源
最近更新 更多