django-restframework-jwt 使用 JWT 令牌时要求 username/password
django-restframework-jwt asks for username/password when using JWT token
我正在使用 Django rest framework-JWT 进行身份验证以处理受保护的 url,我试图通过使用来自 rest 框架的 IsAutchinted
class 来保护 UserDetail 视图,但是每次我尝试发送生成的令牌时,我都会收到以下响应
{
"username": [
"This field is required."
],
"password": [
"This field is required."
]
}
我已经包含授权 header 并且我在我的 header 前缀中设置了 "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)
我做错了什么?为什么即使令牌包含在 header 中,它仍然要求输入用户名和密码?
我执行 IsAutchinted class 的方式是否正确?或者这可能是 JWT 无法正常工作的原因,因为我正在使用休息框架许可 classes?
更新:我的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',
)
}
部分更新模型需要您在创建 Serializer 对象时使用 partial
属性,如下所示。
serializer = UserSerializer(user, data=request.data, partial=True)
错误消息绝对不是来自 restframework-jwt 库,因为它应该是 Invalid username/password.
中的一条消息
我正在使用 Django rest framework-JWT 进行身份验证以处理受保护的 url,我试图通过使用来自 rest 框架的 IsAutchinted
class 来保护 UserDetail 视图,但是每次我尝试发送生成的令牌时,我都会收到以下响应
{
"username": [
"This field is required."
],
"password": [
"This field is required."
]
}
我已经包含授权 header 并且我在我的 header 前缀中设置了 "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)
我做错了什么?为什么即使令牌包含在 header 中,它仍然要求输入用户名和密码?
我执行 IsAutchinted class 的方式是否正确?或者这可能是 JWT 无法正常工作的原因,因为我正在使用休息框架许可 classes?
更新:我的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',
)
}
部分更新模型需要您在创建 Serializer 对象时使用 partial
属性,如下所示。
serializer = UserSerializer(user, data=request.data, partial=True)
错误消息绝对不是来自 restframework-jwt 库,因为它应该是 Invalid username/password.