繁体   English   中英

从视图内部生成 Django JWT 令牌

[英]Generate Django JWT token from inside a view

我正在处理一个 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."]}

如何传递当前用户的凭据来为他生成令牌? 我需要生成一个令牌并将其发送回用户,然后他将能够将此令牌用于我们的其余 api。 我如何在这个视图中生成这个令牌?

请帮帮我!

提前致谢!

我们可以在需要时轻松手动创建令牌,无论从哪里开始,但我们只需要在那里可以访问当前用户对象。 根据Django-Rest-Framework-JWT的文档,我们可以使用以下代码创建令牌:

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 令牌作为响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM