【问题标题】:django-restframework-jwt asks for username/password when using JWT tokendjango-rest framework-jwt 在使用 JWT 令牌时询问用户名/密码
【发布时间】:2018-02-24 23:12:59
【问题描述】:

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

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

我已包含授权标头,并且我已在标头前缀中设置为“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)

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

我做 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',

    )
}

【问题讨论】:

  • 你是如何在django设置中配置rest框架的?尤其是DEFAULT_AUTHENTICATION_CLASSES 选项。
  • 我已经添加到我的问题中,请看一下。
  • 很有趣 - 你可以只用JSONWebTokenAuthentication 测试吗?简单评论BasicAuthenticationSessionAuthentication 用于测试,你能访问页面吗?
  • 它在 GET 请求上运行没有问题,但在 PUT 请求上它一直要求我将用户名和密码作为数据包含(就像获取令牌时一样),即使我有令牌授权前缀是正确的,由于某种原因它完全忽略了标题
  • 另外,在 PUT 请求上发送正确的用户名和密码时,它会更新用户,所以我假设 PUT 请求代码是好的。我看到的所有关于 JWT 的教程都使用 GET 请求来证明它有效,没有人使用 PUT 请求。

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


【解决方案1】:

更新模型部分要求您在创建序列化程序对象时使用partial 属性,如下所示。

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

错误消息绝对不是来自 restframework-jwt 库,因为它可能是类似于 Invalid username/password. 的消息

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2017-03-19
    • 2017-06-25
    • 2019-02-26
    • 2017-03-30
    • 2019-06-20
    • 2017-02-10
    • 2016-08-24
    • 2017-05-28
    相关资源
    最近更新 更多