使用 PUT 请求的 Django JWT 身份验证
Django JWT authentication with PUT request
我正在尝试为使用 JWT 令牌进行身份验证的用户更新 first_name 字段,出于某种原因,当我在没有用户名和密码的不同 table 中执行此操作时领域,我可以很容易地做到这一点,并使用 JWT 令牌更新详细信息。
但是当我在 Django 用户模型默认 table 中执行此操作时,它一直要求我在请求中包含用户名和密码(甚至认为我不想更新它们)。这是我在使用 postman
发送请求时遇到的错误
{
"username": [
"This field is required."
],
"password": [
"This field is required."
]
}
即使我已正确设置授权 header 并且它适用于任何其他请求,但在更新用户详细信息时不适用,我已经包含了所有必要的默认身份验证 classes。感谢您的帮助,现在已经尝试解决这个小问题 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(用户详细信息 class)
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)
我的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',
)
}
JWT 完全正常工作,当根据请求发送旧令牌时,我的签名已过期,但是当我放入最新令牌时,我得到 username/passwords 是必填字段。
您的用户序列化程序正在强制执行所有字段数据,使用 partial=True
允许 partial updates:
serializer = UserSerializer(user, data={'username': u'test'}, partial=True)
我正在尝试为使用 JWT 令牌进行身份验证的用户更新 first_name 字段,出于某种原因,当我在没有用户名和密码的不同 table 中执行此操作时领域,我可以很容易地做到这一点,并使用 JWT 令牌更新详细信息。 但是当我在 Django 用户模型默认 table 中执行此操作时,它一直要求我在请求中包含用户名和密码(甚至认为我不想更新它们)。这是我在使用 postman
发送请求时遇到的错误{
"username": [
"This field is required."
],
"password": [
"This field is required."
]
}
即使我已正确设置授权 header 并且它适用于任何其他请求,但在更新用户详细信息时不适用,我已经包含了所有必要的默认身份验证 classes。感谢您的帮助,现在已经尝试解决这个小问题 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(用户详细信息 class)
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)
我的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',
)
}
JWT 完全正常工作,当根据请求发送旧令牌时,我的签名已过期,但是当我放入最新令牌时,我得到 username/passwords 是必填字段。
您的用户序列化程序正在强制执行所有字段数据,使用 partial=True
允许 partial updates:
serializer = UserSerializer(user, data={'username': u'test'}, partial=True)