我正在与 Openresty 合作。
工作:我有一个用 Django 设计的网站,如果在 redis 中找到缓存,我正在使用 lua 代码直接从 nginx 重新调整响应内容,而无需转到 django。
问题:当我在我的页面上填写任何表格时,我收到 403(csrf_token 失败问题)。当我直接从 nginx 返回数据时出现此问题,我无法动态生成 csrf_tokrn。
需要帮助: 我想知道当我直接从 redis 重新调整响应时如何生成 csrf 令牌。
我没有尝试过,但是这个 nginx conf 文件可能会有所帮助https://github.com/shrikeh/csrf-nginx-redis-lua
另一种选择是将令牌从模板中删除,并按照此处的建议通过 ajax 从 Django 动态获取它。无耻的复制粘贴:
// JS code
$.ajax({
url: // your csrf url,
type: 'GET',
data: {type: 'login'}, // only if you need a session id for cookie login
dataType: 'json',
success: function(data) {
$('form').each(function() {
$(this).append(
'<input type=hidden name=csrfmiddlewaretoken ' +
' value="' + data.token + '">');
});
}
});
// Django code
# views.py, don't forget to add to urls.py
def get_csrf(request):
if request.GET.get('type') == 'login':
request.session.set_test_cookie()
return JSONResponse({
'status': 1,
'token': getattr(request, 'csrf_token', 'NOTPROVIDED')
})