首页 文章

django-restframework-jwt在使用JWT令牌时要求输入用户名/密码

提问于
浏览
2

我正在使用Django rest framework-JWT进行身份验证来处理受保护的URL,我试图通过使用来自rest框架的 IsAutchinted 类来保护UserDetail视图,但是每次我尝试发送生成的令牌时,我都会得到以下响应

{
"username": [
    "This field is required."
],
"password": [
    "This field is required."
]
}

我已经包含了Authorization标头,因为我在我的 Headers 前缀中设置了“JWT”

curl -H "Authorization: JWT <token>" -X PUT  http://localhost:8000/user/3/ -d '{"first_name":"curl_test"}'

获取JWT令牌,刷新,验证URL工作正常并生成链接,我只是无法让JWT使用令牌而不是用户名和密码来验证用户名和密码 .

这是我对用户详细信息的看法

class UserDetail(APIView):
    permission_classes = (IsOwner, IsAuthenticated)
    """
    Retrieve, update or delete a user instance.
    """

    def get_object(self, pk):
        try:
            return User.objects.get(pk=pk)
        except User.DoesNotExist:
            raise Http404


    def get(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            user = Profile.objects.get(id=pk)
            user.profile.updated = timezone.now()
            user.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

我究竟做错了什么?为什么即使令牌包含在 Headers 中,它仍然要求用户名和密码?

我正在做IsAutchinted类的方式是正确的吗?或者这可能是JWT无法工作的原因,因为我正在使用休息框架权限类?

更新:我的settings.py

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',

    )
}

1 回答

  • 1

    更新模型部分要求您在创建Serializer对象时使用 partial 属性,如下所示 .

    serializer = UserSerializer(user, data=request.data, partial=True)
    

    错误消息肯定不是来自restframework-jwt库,因为它本来是一条消息 Invalid username/password.

相关问题