【问题标题】:How to disable Caching in CORS-Anywhere?如何在 CORS-Anywhere 中禁用缓存?
【发布时间】:2019-06-03 23:00:05
【问题描述】:

我在尝试使用cors-anywhere 在不同服务器上的端点上执行POST 请求时遇到CSRF token validation failed 错误。这主要是因为我传递给 cors-server 的 CSRF 令牌被缓存,因此验证失败。

我已阅读以下 Stack Overflow 链接 - Similar issue .原来我的问题与链接中的问题相同,但由于该链接不包含任何解决方案,所以我在这里问它。

请帮忙。

编辑:-

                  $.ajax({
                          async: false,
                          crossDomain: true,
                          data: batch_request,
                          url: "https://cors-anywhere.herokuapp.com/https://......api.s4hana.ondemand.com:xxx/sap/opu/odata/sap/API_MKT_CONTACT_SRV;v=0002/$batch",
                          type: "POST",
                          beforeSend: function (xhr) {
                            xhr.setRequestHeader("Authorization", "Basic xxxxxxxxxxxxxxx");
                            xhr.setRequestHeader("X-CSRF-Token", "xxxxxxxxx");
                            xhr.setRequestHeader("Content-Type", "multipart/mixed;boundary=batch");
                          },
                          success:function(response) {
                              console.log("Succesfully added new contacts");
                              console.log(response);
                        },
                        error: function (error) {
                              console.log("Error");
                              console.log(error);
                        }
                    });

我使用 POSTMAN 进行了 GET 调用,并从服务器检索了 CSRF 令牌。目前,我已经在 AJAX 调用中对令牌进行了硬编码。执行此操作时收到以下错误-

【问题讨论】:

  • 在你提到的问题中,它是一个 GET 请求,但你的是一个 POST,并且通常没有这样的缓存问题 - 所以我很怀疑你的问题分析在这里是否真的正确.也许令牌与请求的客户端 IP 地址或类似的东西相关联,这实际上是导致它失败的原因......?
  • 或者您是在谈论关于首先获取令牌的初始 GET 请求的缓存?那么任何旧标准的普通缓存破坏(比如将当前时间戳作为附加查询字符串参数附加)都应该可以解决问题。
  • 我认为我没有提到任何 GET 请求。我正在发出一个 POST 请求,其中包含通过 GET 调用从服务器获取的 CSRF 令牌。服务器的响应结果表明 CSRF 验证失败。所以,我打开 Postman,进行 GET 调用以获取 CSRF 令牌,现在我在浏览器发出的 POST 调用中硬编码这个 CSRF 令牌。同样,post 调用失败。
  • 还有一点需要注意。在 Postman 中,每当我进行 GET 调用以获取 CSRF 令牌时,它都会返回相同的令牌(至少一个小时)。但是当我通过浏览器(使用 cors-anywhere)做同样的事情时,我会为我所做的每个 GET 调用收到一个新令牌。
  • “它返回相同的令牌(至少一个小时)” - 那么该令牌也适用于多个请求吗? “但是当我通过浏览器(使用 cors-anywhere)做同样的事情时,我会为我所做的每个 GET 调用收到一个新令牌” - 每次都有一个 不同的 值对我来说听起来不像是缓存问题。

标签: javascript node.js cors csrf cors-anywhere


【解决方案1】:

CSRF 验证取决于匹配与请求关联的两个令牌。通常,一个在请求本身中,另一个存储在通过 cookie 与请求关联的会话中。

由于您正在通过一个简单的代理,因此您将自己匿名,并且没有与请求关联的会话。


如果您想解决这个问题,那么您需要编写自己的服务器端代理,以维护每个用户的会话。

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 2015-11-30
    • 2015-11-18
    • 2018-02-21
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多