小编phe*_*epp的帖子

如何通过 ngrok 在请求中包含 Django CSRF 令牌?

我正在构建一个 Django 应用程序,该应用程序将托管在本地网络上并使用 Facebook 登录执行身份验证。由于 Facebook 登录要求登录的回调地址是本地主机或可公开寻址的地址,因此我使用 ngrok 创建 Facebook 返回数据的地址。

用户使用 Facebook 登录后,我使用 AJAX 从模板执行 POST 和他们的数据到本地视图 (/fb_login),该视图保存到我在 Django 中的数据库中。由于身份验证基于此数据库,因此我认为避免 Django 在此视图上执行的 CSRF 检查是不明智的。

要将 CSRF 令牌包含在到 /fb_login 的 POST 中,我使用了以下几个论坛建议的内容:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
            // Only send the token to relative URLs i.e. locally.
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这应该只包括相对 URL 的 CSRF 令牌(我认为这是最佳实践)。当我在本地主机上运行服务器并从同一台机器上执行 Facebook 登录时,这工作正常。但是,当我在本地主机上运行系统并从本地网络上的另一台机器通过 ngrok 访问它并执行 Facebook 登录时,我收到 403 和一条消息,指出 CSRF 检查失败。这让我相信 ngrok URL 不被视为“本地”,因此未设置 CSRF 令牌。

假设我在 Django 服务器启动时知道我的 …

python django csrf facebook-login ngrok

5
推荐指数
0
解决办法
462
查看次数

标签 统计

csrf ×1

django ×1

facebook-login ×1

ngrok ×1

python ×1