Django Rest Framework JWT: How to change token expiration message

2k Views Asked by At

When the JWT token that I'm sending is expired, I'm getting this message...

{
    "detail": "Signature has expired."
}

Now, I want to change the response with my custom message, like...

{
    "message": "token has expired.",
    "data": null,
    "status": 401
}

I tried it to do within APIView, but It's not working.

1

There are 1 best solutions below

3
On

Here's what ive did for my project. Not the best solution i guess. But it works fine.

  1. create your own serializer.
  2. Subclass your view from JSONWebTokenAPIView.
  3. Then add whatever attrs you want to your response, customize response message etc in view code.
# 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