如何使 DRF ( Django-REST-Framework) 令牌保持不变,使其在每次页面刷新后不会丢失?
Posted
技术标签:
【中文标题】如何使 DRF ( Django-REST-Framework) 令牌保持不变,使其在每次页面刷新后不会丢失?【英文标题】:How to make the DRF ( Django-REST-Framework) Token persist so that it does not get lost after each page refresh? 【发布时间】:2019-12-28 20:31:36 【问题描述】:注意——我没有在前端使用 Python、Django、模板。纯 HTML+jQuery+AJAX
我已成功实现从 API 后端获取基于用户的令牌,在头文件中为后续请求设置它并处理 API 提供的数据。但问题是,每当我刷新页面时,标题中都不存在Authentication
令牌,我必须再次提供凭据才能访问 API。每次我刷新页面时,都会删除令牌。我怎样才能阻止这种情况?
这是我使用 jQuery+AJAX 设置 Header 的代码。
$('#login').click(function ()
//Send a POST Request to the URL for Token specified for User
$.ajax(
type: 'POST',
data:
username: $('#username').val(),
password: $('#password').val()
,
url: 'http://127.0.0.1:8000/rest-api/api-token-auth/',
success: function (res)
console.log(res.token)
//Initialize the Ajax for the first time
$.ajaxSetup(
//Set the headers so that these will be in every HTTP Request
headers:
"Authorization": 'Token ' + res.token
);
,
error: function (XMLHttpRequest, textStatus, errorThrown)
alert("Error: " + errorThrown);
);
);
【问题讨论】:
【参考方案1】:作为非常基本的设置,您可以在从服务器获取令牌时将其保存在本地存储中
success: function (res)
console.log(res.token)
localStorage.setItem('authToken', res.token)
随时随地获取它localStorage.getItem('authToken')
。它会在页面刷新之间持续存在,甚至在浏览器/系统重新启动时也会持续存在。
要为 ajax 自动设置,请在页面加载时执行此代码
$.ajaxSetup(
headers:
"Authorization": 'Token ' + localStorage.getItem('authToken')
);
【讨论】:
谢谢老兄!但是如果同一台计算机上有多个用户怎么办?不会危及安全吗?保存在会话存储中不是比本地更好吗? 不客气 :)。好吧,这取决于您的应用程序。本地存储比会话存储更持久。会话存储仅保留在创建它的选项卡/窗口中。但您不应仅依赖它并实施额外的安全措施。您应该为用户提供手动注销的选项,并在注销时从客户端销毁令牌,并在服务器端使其无效。其次,您不应该像会话那样发行有效期很长的令牌。保持令牌的生命周期非常短(如 5 或 10 分钟),并在用户使用应用程序时在后台保持刷新。以上是关于如何使 DRF ( Django-REST-Framework) 令牌保持不变,使其在每次页面刷新后不会丢失?的主要内容,如果未能解决你的问题,请参考以下文章
如何覆盖 django rest 框架( DRF )中的响应类?