在搜索互联网之后,人们通常会处理这种情况---前端是由django视图函数生成的,它可以向用户发送csrf令牌的cookie。 当用户使用ajax向服务器发出请求时,人们可以重写将csrf发送到服务器的ajaxSend行为。
但是,我的情况是我的前端完全与后端分离,即我的前端是在运行nginx的专用服务器中,我只有一个html使用hashbang提供所有不同的页面。 我的后端使用不同的域名在不同的服务器上运行,在这种情况下,客户端如何获取csrf cookie? 我的后端只提供了json api返回。
谢谢。
这篇文章相当陈旧,但对于仍然在这里闲逛的人来说:对于客户端 - 服务器设置,例如本机桌面和移动客户端(以及像OP一样的单独前端),最好使用Django Rest Framework的令牌认证。 链接
如果您查看CRSF令牌源:您可以看到所有csrf_middleware都会根据post值检查cookie。 你只需要将post值返回给你的服务器,因为cookie应该已经通过ajax设置了。 如果查看模板标记源,您可以看到它只是将变量从上下文中取出。 如果它可用或将其直接调用上下文处理器,则将其从上下文中拉出来,将其粘贴在响应中。 现在你只需要将它作为POST变量crsf_token发回。
可以说,前端有域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
}