【问题标题】:Django JWT authentication with PUT request带有 PUT 请求的 Django JWT 身份验证
【发布时间】:2018-02-26 09:34:24
【问题描述】:

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

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

即使我设置了正确的授权标头并且它适用于任何其他请求,但在更新用户详细信息时却没有,我已经包含了所有必要的默认身份验证类。任何帮助表示赞赏,已经尝试解决这个小问题 4 天了。

curl 命令不起作用

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

curl 命令工作

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

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

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)

我的设置.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',

    )
}

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

【问题讨论】:

  • 尝试使用patch方法
  • 同样的错误。 JWT 说我必须包含用户名和密码并忽略标头上的令牌
  • 添加你发送到服务器的数据的json,
  • 您希望我包含我发送的 curl 命令吗?一旦我的笔记本电脑完成更新,我就会这样做
  • 是的,请将其添加到您的问题中

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


【解决方案1】:

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

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

【讨论】:

  • 我更新完笔记本电脑后会试一试
  • 我刚试过,问题不是部分更新或完全更新,我在没有用户名/密码字段的不同表上有相同的确切代码,并且使用 PUT 请求很好与智威汤逊。问题似乎与rest-framework-jwt有关,即使包含令牌标头,它也需要用户名和密码。获取/验证/刷新令牌没有问题。
  • 你怎么知道返回的错误是来自JWT而不是UserSerializer?堆栈跟踪?
猜你喜欢
  • 2016-11-22
  • 2012-09-02
  • 2020-09-12
  • 2017-06-01
  • 2018-06-22
  • 2015-09-21
  • 2012-11-29
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多