当后端和前端分离时,Django CSRF

时间:2011-11-10 09:07:26

标签: python django csrf django-csrf

在搜索互联网后,人们通常会处理这种情况---前端是由django视图功能生成的,它可以向用户发送csrf令牌的cookie。当用户使用ajax向服务器发出请求时,人们可以重写将csrf发送到服务器的ajaxSend行为。

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

谢谢。

3 个答案:

答案 0 :(得分:1)

这篇文章很老,但对于仍然在这里徘徊的人来说: 对于客户端-服务器设置,例如本机台式机和移动客户端(以及像OP一样的独立前端),最好使用Django Rest Framework的令牌认证。 Link

答案 1 :(得分:-1)

If you look at the CRSF token source: you can see that all the csrf_middleware does it check the cookie against the post value.您只需将post值恢复到服务器,因为cookie应该已经通过ajax设置了。 If you look at the template tag source you can see that it is just taking the variable out of the context.要么将其从上下文中删除,请将其粘贴到您的响应中(如果可用)或calling the context processor directly.现在您只需要将其作为POST变量crsf_token发回。

答案 2 :(得分:-1)

可以说,前端有域frontend.example.com和后端域backend.example.com。 (如果你是像Django休息框架那样的东西) 如果可以使用,有两种方法可以启用安全层,即。 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 App,请执行以下操作,

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

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

headers : {
    "x-csrftoken" : $cookies.csrftoken
}