自定义 Django SimpleJWT 视图

Customized Django SimpleJWT Views

我正在使用 django-simplejwt 并且我有一个自定义令牌视图来获取令牌。我的问题是,如何覆盖视图中的 401 Unauthorized 响应?

https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class ObtainTokenSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)


        # Add custom claims
        token['name'] = user.first_name
        # ...

        return token

class ObtainToken(TokenObtainPairView):
    serializer_class = ObtainTokenSerializer

答案可能存在于引发的异常中。

当您深入研究 simplejwt 包时,您会看到如下内容:

class InvalidToken(AuthenticationFailed):
    status_code = status.HTTP_401_UNAUTHORIZED
    default_detail = _('Token is invalid or expired')
    default_code = 'token_not_valid'

这是您看到的 401 的来源。

因此你的 class ObtainToken 应该用你特定的 ExceptionResponse.

例如:

from rest_framework import status
...

class ObtainToken(TokenObtainPairView):
    serializer_class = ObtainTokenSerializer
    ...
    def post(self, request):
        serializer = self.serializer_class(
            data=request.data, 
            context={'request': request}
        )

        try:
            serializer.is_valid()

            return Response(
                serializer.validated_data,
                status=status.HTTP_200_OK
            )
        except Exception:
            return Response(status=status.HTTP_404)

尽管以上只是一个示例,您应该实现与 TokenViewBase 中的 post 方法类似的东西,但使用您自定义的状态和数据。