我们如何在 Linux 上使用 axios 发送带有 Kerberos 身份验证的 post 请求?
Posted
技术标签:
【中文标题】我们如何在 Linux 上使用 axios 发送带有 Kerberos 身份验证的 post 请求?【英文标题】:How do we send post request with Kerberos authentication with axios on linux? 【发布时间】:2022-01-14 06:23:54 【问题描述】:我们正在尝试调用 POST api 来生成证书以更新证书。但是根据第 3 方 API 要求,我们需要验证 Kerberos 身份验证。我们尝试了很多事情都没有运气。
我们在尝试运行时遇到 401 未经授权的错误。
技术栈:Node.js、javascript、Kerberos 身份验证、Linux 操作系统。
代码sn-p:
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);
);
尝试了这种方法但没有成功:How do I use Negotiate or Kerberos authentication with axios?
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:我无法在 axios 中找到任何 Negotiate 支持的痕迹。您链接的帖子说 在浏览器中 它会自动工作,这对于任何浏览器内 JavaScript(在幕后使用 Fetch 或 XMLHTTPRequest)都是如此——但node
CLI 是一个不同的世界.通过Node CLI运行时,axios会使用Node提供的HTTP客户端,不做Kerberos。
您似乎需要手动实现这一点,通过使用 krb5
模块获取令牌,然后告诉 axios 在 Authorization
标头中发送它 - 类似于 Bearer 令牌。
以下示例似乎有点可以工作,虽然不是很漂亮——它无法处理“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 代码的经验,尤其是基于异步的代码,虽然理论上 应该 可以使用 axios 的 transformRequest
来动态获取每个请求的新令牌,我无法弄清楚如何在同步函数中做到这一点。)
一般来说,我可能会改用 Python 来完成这项任务(它具有维护良好的 Kerberos 集成,分别使用 requests-gssapi
或 httpx-gssapi
用于请求或 httpx)。
请注意,Kerberos 不能确保 HTTP 的数据完整性,因此您仍然必须使用 HTTPS,否则有人仍然可以简单地 MitM 请求。
【讨论】:
感谢您的回答。我在系统中安装 node js 包时遇到了一些问题,因此我现在可以验证您提供的解决方案。但是,一旦我解决了当前的问题,我会尝试这个。非常感谢。以上是关于我们如何在 Linux 上使用 axios 发送带有 Kerberos 身份验证的 post 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何将简单值从 axios.post 发送到 asp.net 核心?
如何从axios.post发送简单的值到asp.net核心?
210629:Linux中使用curl命令发送带参数的get请求和post请求-Redis中常用命令