首先,感谢您的查看/帮助。
我正在尝试从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票证进行协商请求的正确路径吗?
再次感谢!
因此,结果是预期的。我不知道您必须对我们的服务器提出任何未经授权的请求才能取回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