Node中的Kerberos程序包返回空响应

问题描述 投票:0回答:1

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

我正在尝试从Node中的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上运行它。我已经从自制软件安装了krb5。

问题是,为什么这不返回任何期望的信息(尚不确定期望的是什么,并且这是能够使用Kerberos票证进行协商请求的正确路径吗?

再次感谢!

javascript node.js kerberos spnego negotiate
1个回答
0
投票

因此,结果是预期的。我不知道您必须对我们的服务器提出任何未经授权的请求才能取回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

© www.soinside.com 2019 - 2024. All rights reserved.