首页 > 解决方案 > Node 中的 Kerberos 包返回空响应

问题描述

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

我正在尝试使用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
}

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

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

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

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

再次感谢!

标签: javascriptnode.jskerberosspnegonegotiate

解决方案


所以,结果在意料之中。我不知道您必须向我们的服务器发出任何未经授权的请求才能取回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


推荐阅读