我们如何在 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-gssapihttpx-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中常用命令

axios的使用

如何利用linux 的mail命令发送带格式(比如正文的字体,大小等)的邮件呢?

axios 是如何封装 HTTP 请求的