【问题标题】: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 应该使用您特定的 Exception 或 Response 覆盖来自母类 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 方法,但使用您自定义的状态和数据。