【发布时间】: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