我正在开发一个Django(1.10)项目,并使用Django Rest Framework为我的项目创建了一个api。我需要从我的视图中生成JWT令牌。
以下是我的尝试:
settings.py 中的REST Framework设置:
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(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”:[“此字段为必填项。”],“密码”:[“此字段为必填项。”]}
如何通过当前用户的凭据为他生成令牌? 我需要生成一个令牌并发回给用户,然后他就可以将这个令牌用于我们的休息api。如何在此视图中生成此标记?
请帮帮我!
提前致谢!
答案 0 :(得分:1)
我们可以在需要时手动创建令牌,无论从哪里开始,我们只需要在那里访问当前用户对象。 根据{{3}}的文档,我们可以使用以下代码创建令牌:
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
因此,对于这个问题,此代码将在视图中工作:
if request.method == 'POST':
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(request.user)
token = jwt_encode_handler(payload)
return HttpResponse('Get token auth request and data is as: {}'.format(token))
它将返回一个JSON令牌作为响应。