SSL / https从标头中删除X-CSRFToken

时间:2017-03-01 15:52:37

标签: node.js ssl nginx reverse-proxy

安装SSL / https密钥后,X-CSRFToken被删除。我也设置了http2。在Https之前一切正常但现在我得到403因为缺少CSRF令牌。无法找到解决此特定问题的信息。谢谢你的帮助。

support
  server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    server_name site.io www.site.io;

    # Use the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/site.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.io/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include /etc/nginx/snippets/ssl-params.conf;

    add_header Strict-Transport-Security max-age=500;

    access_log /home/nodejs/site.io/resuma_io_access.log;
    error_log /home/nodejs/site.io/resuma_io_error.log;
    root /home/nodejs/site.io/www/dist/client;

     location ~ ^/(api|user|auth|socket.io-client|sitemap.xml) {
          proxy_set_header   X-Real-IP            $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header   X-Forwarded-Proto $scheme;
          proxy_set_header   Host                   $http_host;
          proxy_set_header   X-NginX-Proxy    true;
          proxy_set_header Upgrade $http_upgrade;
          proxy_ssl_session_reuse off;
          proxy_redirect off;
          proxy_set_header Connection 'upgrade';
          proxy_cache_bypass $http_upgrade;
          proxy_http_version 1.1;
          proxy_pass_header  X-CSRFToken;
          add_header X-Frame-Options SAMEORIGIN;
          sendfile  off;
          proxy_pass         http://nodejs_upstream;
        }
   }

2 个答案:

答案 0 :(得分:0)

我在运行Nginx SSL / https的Django上遇到了同样的问题。

正如布莱恩在Django CSRF check failing with an Ajax POST request所提到的那样。另一种传递csrftoken的方法是通过参数传递它:

$.ajax({
data: {
    somedata: 'somedata',
    moredata: 'moredata',
    csrfmiddlewaretoken: mytoken
},

csrfmiddlewaretoken 代表api用来存储csrftoken的变量名称(django中的csrfmiddlewaretoken):

mytoken 是一个初始化的变量

  1. DOM:使用api的名为variable的标记。 在django中,只需在html文件中添加{%csrf_token%}即可。这将提供csrfmiddlewaretoken变量,该变量可以在jQuery中访问

    mytoken = jQuery("[name=csrfmiddlewaretoken]").val();

  2. COOKIE:要么使用jQuery函数从cookie中获取令牌。

    mytoken = getCookie('csrftoken');

  3. django doc中提到了

    getCookie()函数,以便用AJAX处理CSRF POST。

    当然,这不能解决SSL的头问题,但允许POST,PUT和DELETE请求。它还需要通过每个$ .ajax调用来添加csrfmiddlewaretoken变量

答案 1 :(得分:0)

通过我在stackoverflow上的最后一次搜索,我发现了问题的真正原因。 在我的情况下,它不是一个标题问题,而是一个cookie! CSRFToken不在cookie中!

明确解释了Wtower在403 Forbidden error when making an ajax Post request in Django framework对2015年5月13日的回答。

settings.py中的

CSRF_COOKIE_HTTPONLY = True必须从settings.py 删除或设置为False !!!

  

如果设置为True,客户端JavaScript将无法访问CSRF Coo​​kie!