【发布时间】: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测试吗?简单评论BasicAuthentication和SessionAuthentication用于测试,你能访问页面吗? -
它在 GET 请求上运行没有问题,但在 PUT 请求上它一直要求我将用户名和密码作为数据包含(就像获取令牌时一样),即使我有令牌授权前缀是正确的,由于某种原因它完全忽略了标题
-
另外,在 PUT 请求上发送正确的用户名和密码时,它会更新用户,所以我假设 PUT 请求代码是好的。我看到的所有关于 JWT 的教程都使用 GET 请求来证明它有效,没有人使用 PUT 请求。
标签: django django-rest-framework django-rest-framework-jwt