对 AJAX Web 应用使用 REST 令牌身份验证的好主意



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

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

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

脚注:我知道为了安全起见,通过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 %}

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

在处理 ajax(使用 Web 应用程序(时,您应该使用 SessionAuthentication .这样可以避免提供任何其他数据。唯一的要求是用户登录。

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

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

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

底线:你对令牌身份验证完全没问题,如果你使用会话身份验证,它会真正达到你的目的,否则它会带来一些不那么明显的问题。

最新更新