我使用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 分钟不活动后将会话呈现为过期,或者检查用户是否有多个登录(来自很可能驻留在多台机器中的多个浏览器(。
底线:你对令牌身份验证完全没问题,如果你使用会话身份验证,它会真正达到你的目的,否则它会带来一些不那么明显的问题。