我正在构建一个Django应用程序,该应用程序将托管在本地网络上并使用Facebook登录执行身份验证。由于Facebook登录要求登录的回调地址为localhost或可公开寻址,我使用ngrok为Facebook创建一个地址以返回数据。
用户使用Facebook登录后,我使用AJAX从模板执行POST,将其数据发送到本地视图(/ fb_login),该视图将保存到Django中的数据库。由于身份验证基于此数据库,因此我认为避免Django对此视图执行的CSRF检查是明智的。
要在POST到/ fb_login中包含CSRF令牌,我正在使用以下几个论坛建议:
$.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'));
}
}
});
这应该只包括相对URL的CSRF令牌(我理解这是最佳做法)。当我在localhost上运行服务器并从同一台机器执行Facebook登录时,这很好用。但是,当我在localhost上运行系统并通过ngrok从本地网络上的另一台机器访问它并执行Facebook登录时,我收到403并显示CSRF检查失败的消息。这让我相信ngrok URL不被视为“本地”,因此没有设置CSRF令牌。
假设我知道我的Django服务器启动时我的ngrok URL是什么,为了包含CSRF令牌,我可以将它包含在被视为“本地”地址的地方吗?有没有其他方法可以安全地做到这一点?作为一个注释,网络开发不是我的领域,所以如果我在这里误解了一些内容,请告诉我。谢谢!