具有PUT请求的Django JWT认证

时间:2017-09-17 21:59:55

标签: django django-rest-framework django-rest-auth django-rest-framework-jwt

我正在尝试使用JWT令牌为用户更新first_name字段进行身份验证,出于某种原因,当我在没有用户名和密码字段的其他表中执行此操作时,我可以轻松地执行此操作并更新使用JWT令牌的详细信息。 但是当我在Django用户模型默认表中执行此操作时,它一直要求我在请求中包含用户名和密码(即使我认为我不想更新它们)。这是我使用邮递员发送请求时遇到的错误

delegate

即使我已将权限标头设置为正确并且它可以与任何其他请求一起使用,但在更新用户详细信息时却没有,我已经包含了所有必需和默认的身份验证类。任何帮助表示赞赏,现在试图解决这个小问题4天。

curl命令无法正常工作

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

卷曲命令正常工作

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

注意不同的方法。 我的views.py(UserDetails类)

curl -H "Authorization: JWT <token>" -X GET  http://localhost:8000/user/3/

我的settings.py

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)

JWT完全正常工作,当我在请求上发送一个旧令牌时,我收到签名已过期,但是当我输入最新令牌时,我得到用户名/密码是必填字段。

1 个答案:

答案 0 :(得分:1)

您的用户序列化程序正在强制执行所有字段数据,请使用partial=True允许partial updates

serializer = UserSerializer(user, data={'username': u'test'}, partial=True)