我们如何在 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-gssapi
或 httpx-gssapi
用于请求或 httpx)。
请注意,Kerberos 不确保 HTTP 的数据完整性,因此您仍必须使用 HTTPS,否则有人仍然可以简单地对请求进行中间人攻击。
除了@user1686建议的上述方法外,我已经使用NTLM身份验证解决了这个问题。具体来说,我使用了httpntlm模块。
通过使用 httpntlm 包,我们不需要处理 kerberos 包,因为所有 kerberos 包都对 node-gyp 有很多依赖。
因此,除了 kerberos 相关包之外,最好使用其他解决方案。
注意:这个解决方案对我有用,但它会因用例而异。
我们正在尝试调用 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-gssapi
或 httpx-gssapi
用于请求或 httpx)。
请注意,Kerberos 不确保 HTTP 的数据完整性,因此您仍必须使用 HTTPS,否则有人仍然可以简单地对请求进行中间人攻击。
除了@user1686建议的上述方法外,我已经使用NTLM身份验证解决了这个问题。具体来说,我使用了httpntlm模块。
通过使用 httpntlm 包,我们不需要处理 kerberos 包,因为所有 kerberos 包都对 node-gyp 有很多依赖。
因此,除了 kerberos 相关包之外,最好使用其他解决方案。
注意:这个解决方案对我有用,但它会因用例而异。