首页 > 解决方案 > 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 请求而失败?

标签: node.jsaxios

解决方案


我最近遇到了这个问题,一个对我有用的解决方案是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标题,有必要将它们合并为一个。


推荐阅读