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

问题描述 投票:13回答:3

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

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

谢谢。

python django csrf django-csrf
3个回答
3
投票

这篇文章相当陈旧,但对于仍然在这里闲逛的人来说:对于客户端 - 服务器设置,例如本机桌面和移动客户端(以及像OP一样的单独前端),最好使用Django Rest Framework的令牌认证。 链接


-1
投票

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


-1
投票

可以说,前端有域frontend.example.com和后端域backend.example.com。 (如果你是像Django休息框架那样的东西)如果你可以使用有两种方法可以启用安全层即ie。 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
}
© www.soinside.com 2019 - 2024. All rights reserved.