如何使 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 学习之DRF

DRF完整版

DRF完整版

如何覆盖 django rest 框架( DRF )中的响应类?

django-cors-headers 不适用于 DRF(Django Rest 框架)

如何将 DRF 序列化器与 Graphene 一起使用