【问题标题】:Kerberos package in Node returns a null responseNode 中的 Kerberos 包返回空响应
【发布时间】:2019-11-12 20:53:31
【问题描述】:

首先,感谢您查看/帮助。

我正在尝试使用 Node.js 中 npm 的 kerberos 包中的 initializeClient 函数。我的目标是能够向我们的内部 API 发出请求。

const kerberos = require('kerberos')

var company = 'company'
var service = `HTTP/internal.${company}.com@SERVER.${company.toUpperCase()}.COM`
var options = { principal: `firstname@SERVER.${company.toUpperCase()}.COM` }

kerberos.initializeClient(service, options, (err, details) => {
    console.log(details)
})

返回的响应是:

KerberosClient {
  contextComplete: false,
  responseConf: 0,
  response: null,
  username: null
}

据我所知,这个函数是如何工作的,你将服务、选项(包括主体)和回调函数传递给它。

似乎该函数正在运行,但没有返回任何数据。我还尝试传递一个空对象作为选项,看起来它会从机器中提取当前票证,这是首选。

我在 macOS 10.14 上使用 Node v12.4.0 运行它。我已经从 homebrew 安装了 krb5。

问题是,为什么这没有返回任何预期的内容(尚不确定预期的内容),这是能够使用 Kerberos 票证发出协商请求的正确路径吗?

再次感谢!

【问题讨论】:

  • 有一点要提一下,当我在终端中执行kdestory 时,响应返回为null,而当我执行kinit 时,它返回上面的响应。这意味着 initializeClient 的函数确实在我的机器上看到了我的 keytab 文件。

标签: javascript node.js kerberos spnego negotiate


【解决方案1】:

所以,结果在意料之中。我不知道您必须对我们的服务器发出任何未经授权的请求才能取回www-negotiate 标头。然后您可以将详细信息中提供的字符串与 step() 函数一起使用。

const request = require('request')
const kerberos = require('kerberos')
const {hostname} = require('./env')
const service = `HTTP@${hostname}`
const url = `https://${hostname}`

// Creates a Kerberos token and exchanges for an XSRF token.
function getXSRF() {
  return new Promise((resolve, reject) => {
    request.get(url, () => {
      const mechOID = kerberos.GSS_MECH_OID_KRB5

      // Send a request un-authenticated
      kerberos.initializeClient(service, { mechOID }, (err, client) => {
        if (err) {
          reject(err)
        } else {

          // Generate the first Kerberos token
          client.step('', (err, kerberosToken) => {
            if (err) {
              reject(err)
            } else {
              var options = {
                url, 
                headers: { 
                  Authorization: `Negotiate ${kerberosToken}`
                }
              }
      
              // Attach the Kerberos token and resend back to the host
              request.get(options, (err, response) => {
                if (err) {
                  reject(err)
                } else {
                  var result = {xsrf: JSON.parse(response.body).xsrf, kerberos: kerberosToken}
                  resolve(result)
                }
              })
            }
          })
        }
      })
    })
  })
}

module.exports = {
  getXSRF: getXSRF
}

这里找到了这个例子:https://github.com/mongodb-js/kerberos/blob/master/test/kerberos_tests.js#L79

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多