【问题标题】:Customized Django SimpleJWT Views自定义 Django SimpleJWT 视图
【发布时间】:2021-09-28 07:24:15
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: django django-rest-framework django-rest-framework-simplejwt


    【解决方案1】:

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

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

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

    这就是你看到的 401 的来源。

    因此,您的类 ObtainToken 应该使用您特定的 ExceptionResponse 覆盖来自母类 TokenViewBase 的 post 方法。

    例如:

    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 方法,但使用您自定义的状态和数据。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 2019-06-29
      • 2012-04-03
      • 2011-06-23
      • 2012-02-27
      • 2014-06-23
      • 1970-01-01
      • 2014-06-07
      • 2016-04-01
      相关资源
      最近更新 更多