【发布时间】:2018-09-26 04:25:49
【问题描述】:
我正在开发一个 Django(1.10) 项目,并使用 Django Rest Framework 为我的项目创建了一个 api。我需要从我的视图中生成 JWT 令牌。
这是我尝试过的:
settings.py 中 REST 框架的设置:
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoObjectPermissions'
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
这里是手动获取令牌的 URL:
url(r'^api-token-auth/', obtain_jwt_token)
这是用户请求获取令牌的模板:
<div class="col-md-9 content">
<div class="world-map" style="width: 100%; margin-left:2%">
<h3> Get your Authorization Token to use REST Api :</h3>
</div>
<div class="col-lg-6" style="margin-top: 20%; margin-left: 25%;"><br>
<form action="{% url 'users:getApiAuthToken' %}" method="post" id="getTokenForm">
{% csrf_token %}
<a href="" style="text-decoration: none; color: white;">
<button type="submit" class="btn waves-effect waves-light pull-right" value="Submit" id="enableApi" style="padding-right: 10%; font-size: 20px;"><i
class="material-icons left">casino</i> Generate Api Token!</button></a>
</form>
</div>
</div>
下面是发送 ajax 请求的方式:
$(document).on('submit', '#getTokenForm', function (e) {
e.preventDefault();
$.ajax({
url: '{% url 'users:getApiAuthToken' %}',
type: 'POST',
data: {
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
},
success: function (data) {
console.log(data);
}
});
});
这是我的看法,该请求将在哪里处理:
if request.method == 'POST':
post_data = request.POST.copy()
post_data.update({'user': request.user.pk})
payload = {'username': request.user.username, 'password': request.user.password}
r = requests.post('http://127.0.0.1:8000/api-token-auth/', params=payload)
return HttpResponse('Get token auth request and data is as: {}'.format(r.text))
但它返回为:
获取令牌认证请求和数据为:{"username":["This field is required."],"password":["This field is required."]}
如何传递当前用户的凭据为他生成令牌? 我需要生成一个令牌并将其发回给用户,然后他将能够将此令牌用于我们的 rest api。我怎样才能在这个视图中生成这个令牌?
请帮帮我!
提前致谢!
【问题讨论】:
-
您的问题还不清楚,但就其价值而言,POST 数据是通过 Python 请求中的
data参数传入的,而不是通过params。 -
嗨@SvenMarnach,这是登录用户的视图,而这正是我应该如何传递用户凭据的问题?
-
您的问题不清楚的原因是错误消息来自您甚至没有显示的代码的一部分,因此我们只能推测发生了什么。也就是说,您无法访问当前用户的密码。数据库只包含一个哈希。您应该使用函数调用来获取 JWT 令牌,而不是 HTTP 请求。
-
嗨@SvenMarnach,这正是我需要的,如何在不发送HTTP请求的情况下生成令牌?请!实际上,这是一个模板,它显示了一个按钮,用于登录用户获取使用我们的 rest API 的令牌,当用户单击此按钮时,它将向 django 中的此视图发送一个发布请求。
-
Django-rest-framework 不支持开箱即用的 JWT 身份验证,因此您必须使用一些自定义代码来生成它,或者使用一些第三方包。您需要弄清楚您使用什么来生成 JWT,然后阅读文档。根据您提供的信息,无法判断。
标签: python django django-rest-framework django-views jwt