我们如何在 linux 上发送带有 axios 的 Kerberos 身份验证的 post 请求?

How do we send post request with Kerberos authentication with axios on linux?

我们正在尝试调用 POST api 来生成用于更新证书的证书。然而,根据第 3 方 API 的要求,我们需要验证 Kerberos 身份验证。我们尝试了很多事情都没有成功。

我们在尝试 运行 时收到 401 未经授权的错误。

技术堆栈:Node.js、Javascript、Kerberos 身份验证、Linux OS。

代码片段:

const axios = require('axios');
const data = {
      Request: "-----BEGIN CERTIFICATE REQUEST-----<csr key>-----END CERTIFICATE REQUEST-----",
      CertificateTemplateName: "DBAPI1Y",
      PrimaryEmail: "test@test.com"
  };
  
  axios.post('http://dummyurl.com/webapi/SubmitRequest', data, "Negotiate")
      .then((res) => {
          console.log(`Status: ${res.status}`);
          console.log('Body: ', res.data);
      }).catch((err) => {
          console.error(err);
      });

尝试过这种方法但没有成功:

有人可以帮忙吗?

我无法在 axios 中找到任何协商支持的痕迹。您链接的 post 说 在浏览器中 它会自动工作,这对于任何 in-browser JavaScript (在场景)——但是 node CLI 是一个不同的世界。 运行 通过 Node CLI 时,axios 将使用 Node 提供的 HTTP 客户端,它不支持 Kerberos。

看来你需要手动实现这个,通过使用 krb5 模块获取令牌,然后告诉 axios 在 Authorization header 中发送它 – 类似不记名代币。

下面的例子似乎有点的效果,虽然不是很漂亮——它不能处理“30x”重定向:

const axios = require("axios");
const krb5 = require("krb5");

// The service is "HTTP" (uppercase), regardless of the URL being http or https.
token = await krb5.spnego({hostbased_service: "HTTP@dummyurl.com"});

resp = await axios.post("https://dummyurl.com/webapi/SubmitRequest",
                        data,
                        {
                            headers: {
                                "Authorization": `Negotiate ${token}`,
                            },
                            // SPNEGO tokens are single-use, so if Axios tries to
                            // follow redirects, the 2nd request will be rejected
                            // as a "replay". So tell it to not even try.
                            maxRedirects: 0,
                        });

(我没有编写“正确的”Node.js 代码的经验,尤其是 async-based 代码,虽然理论上 应该 可以使用axios 的 transformRequest 为每个请求动态获取新令牌,我无法弄清楚如何在同步函数中执行此操作。)

一般来说,我可能会在 Python 中执行任务(其中 well-maintained Kerberos 集成分别使用 requests-gssapihttpx-gssapi 用于请求或 httpx)。

请注意,Kerberos 不确保 HTTP 的数据完整性,因此您仍必须使用 HTTPS,否则有人仍然可以简单地对请求进行中间人攻击。

除了@user1686建议的上述方法外,我已经使用NTLM身份验证解决了这个问题。具体来说,我使用了httpntlm模块。

通过使用 httpntlm 包,我们不需要处理 kerberos 包,因为所有 kerberos 包都对 node-gyp 有很多依赖。

因此,除了 kerberos 相关包之外,最好使用其他解决方案。

注意:这个解决方案对我有用,但它会因用例而异。