node.js - Axios 发布失败,403 CSRF 令牌验证失败,但在 Postman 中工作正常
问题描述
我已经尝试了所有方法,但无法让 Axios 与 SAP Odata Post 服务一起使用。问题是 CSRF 令牌验证失败,但它在 Postman 中工作正常。
我的请求如下所示:
const postNewTasks = async (body, headers) => (await axios.get(getHeadersandCFRSURL, {
headers: { 'authorization': auth, 'x-csrf-token': 'fetch' },
withCredentials: true
}).then((response) => {
axios({
method: 'POST',
url: postBatchOperationsURL,
headers: {
"Authorization": auth,
"Content-Type": "multipart/mixed; boundary=batch_1",
"X-CSRF-Token": response.headers["x-csrf-token"], // set CSRF Token for post or update
},
withCredentials: true,
body: body
}).then(function (response) {
console.log(response)
return response
}).catch(function (err) {
console.log(err)
return err
})
})
)
任何人都知道为什么 CSRF 令牌验证因这个 axios 请求而失败?
解决方案
我最近遇到了这个问题,一个对我有用的解决方案是Cookie
从初始响应标头中添加带有 cookie 的set-cookie
标头。
Postman 会自动执行此操作,但 axios 似乎不会。我的那部分代码之后"x-csrf-token":"fetch"
:
var xcsrftoken = response.headers["x-csrf-token"];
var cookies = '"';
for (var i = 0; i < response.headers["set-cookie"].length; i++) {
cookies += response.headers["set-cookie"][i] + ";";
}
cookies += '"';
axiosClient.defaults.headers.common[this.xcsrftokenName] = xcsrftoken;
axiosClient.defaults.headers.common["Cookie"] = cookies;
axiosClient
是由 制成的物体axios.create
。我已将这些标头设置为默认值,以便以后不需要在请求中包含它们。还有多个set-cookie
标题,有必要将它们合并为一个。
推荐阅读
- python-3.x - from collections import Container 和 from collections.abc import Container 的区别
- java - 有没有办法根据用户的角色和@RolesAllowed 可以访问的所有球衣网址列表?
- javascript - Javascript 不能在 Heroku 上运行,但可以在本地运行,我该如何解决这个问题?
- python - 如何正确处理来自 json 响应的错误
- git - 我有一个“git serve”子命令,不知道它来自哪里
- c# - 如何在本地和远程计算机上使用 Windows 搜索服务?
- mongodb - 检查集合是否存在的正确方法是什么?
- javascript - 等待异步函数
- python - 是什么导致“ValueError:检查目标时出错:预期的 dense_2 有 2 个维度,但得到了形状为 (30, 1, 166) 的数组”?
- java - 本地保存html文件时如何使用WebClient构造HtmlPage进行解析?