19

在网上搜索后,人们通常会处理这种情况——前端是由 django view 函数生成的,它可以向用户发送 csrf token 的 cookie。当用户使用 ajax 向服务器发出请求时,人们可以重写将 csrf 发送到服务器的 ajaxSend 行为。

但是,我的情况是我的前端与后端完全分离,即我的前端在一个运行 nginx 的专用服务器中,我只有一个 html 提供所有使用 hashbang 的不同页面。我的后端运行在不同的服务器上,使用不同的域名,在这种情况下,客户端如何获取 csrf cookie?我的后端只提供了 json api 返回。

谢谢你。

4

3 回答 3

7

这篇文章已经很老了,但是对于仍然在这里徘徊的人来说:对于客户端-服务器设置,例如本机桌面和移动客户端(以及像 OP 那样的单独前端),最好使用 Django Rest Framework 的令牌身份验证。关联

于 2018-08-31T02:00:46.897 回答
-1

可以说,前端有域 frontend.example.com,后端有域 backend.example.com。(如果你是 Django rest 框架之类的东西)如果你可以使用有两种方法可以启用安全层,即。CSRF 保护或 CORS

对于 CORS,

pip install django-cors-headers

然后将其配置为 INSTALLED_APPS、MIDDLEWARE_CLASSES 并将前端域添加到 CORS_ORIGIN_WHITELIST。

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com'
)

CORS 将阻止来自除 frontend.example.com 以外的任何域的任何 http 请求


对于 CSRF,

CSRF_COOKIE_DOMAIN = ".mydomain.com"

如果您使用的是 Angular 应用程序,请执行以下操作,

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentials = true;

然后在发出 http 请求时添加标头。

headers : {
    "x-csrftoken" : $cookies.csrftoken
}
于 2017-04-02T03:49:09.113 回答
-1

如果您查看 CRSF 令牌源:您可以看到所有 csrf_middleware 都会根据 post 值检查 cookie。您只需要将 post 值返回到您的服务器,因为 cookie 应该已经通过 ajax 设置。如果您查看模板标记源,您会发现它只是将变量从上下文中取出。如果它可用,则将其从上下文中拉出,或者直接调用上下文处理器,将其粘贴在您的响应中。现在您只需将其作为 POST 变量 crsf_token 发送回来。

于 2017-04-02T03:10:51.797 回答