使用Openresty和Django作为后端服务器,在nginx中生成csrf_token。

我正在使用Openresty。

工作: 我有一个使用Django设计的网站,通过使用Lua代码直接从nginx返回响应内容,如果在redis中发现缓存,就不需要转到Django。

问题: 当我在页面上填写任何表单时,我会收到403(csrf_token失败问题)。当我直接从nginx返回数据时,出现这个问题,我无法动态生成csrf_tokrn。

需要帮助: 我想知道当我直接从redis返回响应时,如何生成csrf令牌。

点赞
用户263989
用户263989

我没有亲自尝试,但是这个 Nginx 配置文件可能很有用 https://github.com/shrikeh/csrf-nginx-redis-lua

另一个选择是从 Django 中通过 ajax 动态获取令牌并在模板中不包含它 就像这里建议的那样。无 shame 代码:

// JS 代码
$.ajax({
    url: // 你的 csrf url,
    type: 'GET',
    data: {type: 'login'},  // 只有当你需要一个会话 id 用于 cookie 登录时
    dataType: 'json',
    success: function(data) {
        $('form').each(function() {
            $(this).append(
                '<input type=hidden name=csrfmiddlewaretoken ' +
                    ' value="' + data.token + '">');
        });
    }
});

// Django 代码
# views.py, 不要忘记在 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')
    })
2014-07-30 15:37:27