通过 nodejs 在超集中导入仪表板时出现 CSRF 问题 API

CSRF issue while importing dashboard in superset through nodejs API

我在尝试通过 NodeJS POST API 调用导入仪表板(启用 VERSIONED_EXPORT)时遇到 flask_wtf.csrf:The CSRF session token is missing.。下面是适用于我所有其他超集 API 调用的相同设置:

const config = {
  headers: {
    'X-CSRFToken': await this.getCsrfToken(),
    'Authorization': `Bearer ${await this.getAccessToken()}`
  }
}
axios.get<T>(url, config) //or
axios.post<T>(url, data, config)

对于导入仪表板 API 调用,我正在使用 form-data,如果我将仪表板导入添加到 WTF_CSRF_EXEMPT_LIST,它会起作用,但我想避免这样做,但它不能'不适用于我尝试过的所有这些方法:

const formData = new FormData()

// With X-CSRFToken (shown above)
formData.append('formData', fs.createReadStream(filePath))

// With X-CSRFToken & defined file name & length
var stat = fs.statSync(filePath);
formData.append('formData', fs.createReadStream(filePath), {filename: fileName, knownLength: stat.size})

// With X-CSRFToken and/or Referral and/or Content-Type and/or Content-Length
var stat = fs.statSync(filePath);
formData.append('formData', fs.createReadStream(filePath), {filename: fileName, knownLength: stat.size})

const contentLength = formData.getLengthSync()
const config = {
  headers: {
    'X-CSRFToken': await this.getCsrfToken(),
    'Authorization': `Bearer ${await this.getAccessToken()}`
    'Referrer': url,
    'Content-Type': 'multipart/form-data',
    'Content-Length': contentLength
  }
}

// With X-XSRF-TOKEN
const config = {
  headers: {
    'X-XSRF-TOKEN': await this.getCsrfToken(),
    'Authorization': `Bearer ${await this.getAccessToken()}`
  }
}
formData.append('formData', fs.createReadStream(filePath))



await post(url, formData, config)

我怀疑这可能是由 form-data 引起的,它无法处理 csrf 令牌 headers,因为我可以在 Postman 上导入仪表板:

Headers: {
  Authorization: 'Bearer {token}',
  X-CSRFToken: {csrfToken}
}
form-data: {
  formData: {uploadedFile}
}

我乐于接受有关如何在不使用 form-data 节点

的情况下导入仪表板的建议

这是 csrf 令牌的常见问题。 见相关 post.

在超集情况下,您不仅需要获得 csrf 令牌,还需要获得 session cookie。 Session cookie 看起来像这样

session=eyJjc3JmX3Rva2VuIjoiMGYwMzRiNzgyMzIyMDgwNTM5M2Y4YzdjODYyZmIzZGMyMGJlYjAwZiJ9.Ykb6sQ.PSJYvZBxYK7nEMzK3smE4WUSVEY;

您需要将此 session 信息添加到您客户端的 Cookie header 中,它将起作用。