【问题标题】:XHR2 file upload to subdomain token mismatch in Laravel5.1/nginx upload moduleXHR2 文件上传到 Laravel5.1/nginx 上传模块中的子域令牌不匹配
【发布时间】:2015-08-26 00:34:57
【问题描述】:

我对 domain.com 和 upload.domain.com 使用 Laravel5.1,相同的脚本(复制粘贴并更改配置文件中的站点 url)。

会话域设置为 .domain.com 并且在 upload.domain.com 上我已将所有 CORS 标头添加到 upload.domain.com 和 ajax 帖子工作正常,并使用数据库进行会话。

我有以下 nginx 配置:

location /upload {

add_header Access-Control-Expose-Headers Accept-Ranges;
add_header Access-Control-Expose-Headers Content-Encoding;
add_header Access-Control-Expose-Headers Content-Length;
add_header Access-Control-Expose-Headers Content-Range;
add_header accept_ranges bytes;

upload_state_store /tmp;
upload_resumable on;
add_header Pragma no-cache;
add_header X-Content-Type-Options nosniff;
#add_header Cache-control "no-story, no-cache, must-revalidate";

# Access control for CORS
{ ....}

add_header X-CSRF-Token $HTTP_X_CSRF_TOKEN;
add_header X-XSRF-TOKEN $HTTP_X_CSRF_TOKEN;
upload_set_form_field "_token" $HTTP_X_CSRF_TOKEN;

client_max_body_size 4096m;
upload_pass /internal_upload;
upload_pass_args on;

upload_store /storage/uploaded 1;
upload_store_access user:r group:r all:r;
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
upload_cleanup 400 404 499 500-505;


}

位置 /internal_upload {

proxy_pass http://upload.domain.com/fileupload/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

在执行 XHR2 请求时,我使用以下方式通过标头传递令牌:

xhr.setRequestHeader("X-CSRF-Token", globalObj._token );
xhr.setRequestHeader("X-XSRF-TOKEN", globalObj._token );

最后问题出在最后一步,当 nginx 将数据传递到子域上的后端应用程序时,会抛出令牌不匹配异常。

我还注意到 domain.com 设置了一个名为 X-XSRF-TOKEN 的 cookie,并使用 domain.com 作为域名,upload.domain.com 设置了另一个带有域名 upload.domain.com 的 X-XSRF-TOKEN 令牌。这是否正常,因为两个应用程序都设置了 X-XSRF-TOKEN 并且值不相等,我猜这可能是问题所在,或者可能是 nginx 剥离了一些数据然后将它们传递到后端?

【问题讨论】:

    标签: php ajax nginx laravel-5 csrf


    【解决方案1】:

    为了将来的参考,我必须将设置在主域中的 cookie 与 xhr2 请求一起发送。这是通过将 xhr 设置更改为:

    xhr.withCredentials = true;
    

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2013-11-30
      • 2012-07-26
      • 1970-01-01
      • 2013-01-12
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多