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

Node.js SSL/https从标头中删除X-CSRFToken,node.js,ssl,nginx,reverse-proxy,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

安装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;
        }
   }

我对在Nginx SSL/https上运行的Django也有同样的问题

正如布莱恩在上一篇文章中提到的。传递csrftoken的另一种方法是通过参数传递它:

$.ajax({
data: {
    somedata: 'somedata',
    moredata: 'moredata',
    csrfmiddlewaretoken: mytoken
},
其中,csrfmiddlewaretoken表示api用于存储csrftoken的变量名(django中的csrfmiddlewaretoken):

mytoken是一个初始化的变量

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

    mytoken=jQuery(“[name=csrfmiddlewaretoken]”)。val()

  • COOKIE:使用jQuery函数从COOKIE中获取令牌

    mytoken=getCookie('csrftoken')

  • 为了使用AJAX处理CSRF POST,中提到了getCookie()函数


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

    通过我上次对stackoverflow的搜索,我找到了问题的真正原因。 在我的例子中,这不是一个标题问题,而是一个cookie问题!CSRFToken不在cookie中

    Wtower对2015年5月13日的答复已清楚解释

    settings.py中的
    CSRF\u COOKIE\u HTTPONLY=True
    必须删除或设置为False

    如果设置为True,客户端JavaScript将无法访问CSRF cookie


    你能找到解决办法吗?我相信我也有同样的问题。如果你有上述相同的设置,你可能会在其他地方有问题。它对我不起作用,因为X-CSRF令牌是由后端在任何第一次请求时生成和设置的。但由于所有文件都是由nginx提供的,所以在来宾用户的初始页面加载时并没有请求后端。作为一种解决方法,我在初始页面加载时发出一个服务器请求来创建令牌。