2

我使用 Python/Django 和出色的 Django REST 框架创建了一个 REST Web API。

我目前正在试验身份验证方法,想知道对 AJAX Web 应用程序使用“令牌身份验证”是否是一种好习惯。

我在一个非常基本的 CRUD Web 应用程序中包含了一个示例 HTML 文件,演示了我目前如何使用令牌身份验证。它工作正常,但是只在源中包含身份验证令牌真的可以(关于安全性等)吗?基本身份验证似乎是一个不错的选择,但是我必须在源中同时包含用户名和密码,这对我来说似乎更糟?

脚注:我知道通过 HTTPS 协议更好地使用 REST 以提高安全性,但显然我正在我的开发机器上运行此代码。我计划在生产中使用 HTTPS。

提前感谢您的任何提示!

亲切的问候,克里斯托夫

{% extends 'base.html' %}
{% block title %}Games{% endblock %}
{% block content %}<script type="text/javascript">/*<![CDATA[*/
function getBase() {
    return 'http://api.sandbox.dev:8080/';
}
function getData() {
    return {
        id: $('#id').val(),
        title: $('#title').val(),
    };
}
function getToken() {
    return 'b26ffd6ddb66428ce9164d606f694cd4184ce73e';
}
$(document).ready(function(){
    $('#create').click(function(e){
        $.ajax({
            url: getBase() + 'games/',
            type: 'POST',
            data: getData(),
            dataType: 'json',
            headers: {
                authorization: 'token ' + getToken(),
            },
            complete: function(xhr, textStatus) {
                console.log('textStatus = ' + textStatus);
            },
            success: function(data, textStatus, xhr) {
                console.log('textStatus = ' + textStatus);
            },
            error: function(xhr, textStatus, errorThrown) {
                console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown);
            },
        });
    });
    $('#update').click(function(e){
        if(getData().id) {
            $.ajax({
                url: getBase() + 'games/' + getData().id + '/',
                type: 'PUT',
                data: getData(),
                dataType: 'json',
                headers: {
                    authorization: 'token ' + getToken(),
                },
                complete: function(xhr, textStatus) {
                    console.log('textStatus = ' + textStatus);
                },
                success: function(data, textStatus, xhr) {
                    console.log('textStatus = ' + textStatus);
                },
                error: function(xhr, textStatus, errorThrown) {
                    console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown);
                },
            });
        }
    });
    $('#delete').click(function(e){
        if(getData().id) {
            $.ajax({
                url: getBase() + 'games/' + getData().id + '/',
                type: 'DELETE',
                data: {},
                dataType: 'json',
                headers: {
                    authorization: 'token ' + getToken(),
                },
                complete: function(xhr, textStatus) {
                    console.log('textStatus = ' + textStatus);
                },
                success: function(data, textStatus, xhr) {
                    console.log('textStatus = ' + textStatus);
                },
                error: function(xhr, textStatus, errorThrown) {
                    console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown);
                },
            });
        }
    });
});
/*]]>*/</script><form action="" method="post" onsubmit="return false">
    <dl>
        <dt><label for="id">ID</label></dt>
        <dd><input type="text" id="id" name="id" size="20" maxlength="10" /></dd>
        <dt><label for="title">Title</label></dt>
        <dd><input type="text" id="title" name="title" size="20" maxlength="20" /></dd>
    </dl>
    <p><button type="button" id="create">Create</button></p>
    <p><button type="button" id="update">Update</button></p>
    <p><button type="button" id="delete">Delete </button></p>
</form>{% endblock %}
4

2 回答 2

0

TokenAuthentication主要用于连接到服务器的本机客户端,例如 iOS、Android 或 Windows 应用程序等。

处理 ajax(使用 web 应用程序)时,您应该使用SessionAuthentication. 这使您无需提供任何其他数据。唯一的要求是用户必须登录。

于 2013-10-03T23:24:30.717 回答
0

当您查看 HTTP 电报时,TokenAuthentication 和 SessionAuthentication 的行为是相似的:它们都在登录期间以纯文本形式发送用户名和密码,然后它们使用唯一标识系统的哈希标记它们的请求(令牌使用标头、会话保存在服务器端 cookie 上)。

必须了解会话身份验证将会话保留在 dB 后端,这确实需要在生产系统中进行维护(谁清理过期的会话?),或者它可能是性能瓶颈,需要基于缓存的解决方案。

只有当我需要实现某种超时机制时,我才会选择 SessionAuthentication,这样我会在假设 15 分钟不活动后将会话呈现为过期,或者检查用户是否有多个登录(来自最有可能驻留的多个浏览器)在几台机器上)。

底线:您对 TokenAuthentication 完全没问题,如果您使用 SessionAuthentication 请注意它会真正为您服务,否则它会带来一些不那么明显的问题需要处理。

于 2015-10-23T23:40:19.633 回答