我正在尝试在NodeJS中实现RADIUS OTP身份验证。 我找不到太多的信息,如果有可能的话。 NodeJS:https://www.npmjs.com/package/radius 任何方向都将非常有帮助。
我已经使用CAS RADIUS在Java平台上实现了相同的功能,并且运行良好。 CAS:https://apereo.github.io/cas/6.0.x/mfa/RADIUS-Authentication.html#
答案 0 :(得分:2)
以下是一些信息和指导。
有可能吗?是的。
Nodejs Radius软件包:https://www.npmjs.com/package/radius Nodejs OTP软件包:https://www.npmjs.com/package/otplib
将半径包用于OTP的示例:https://github.com/mcguinness/simple-radius-server
您应该能够分叉示例并将其修改为使用OTP软件包生成OTP令牌。
另一种可能性是将FreeIPA部署在docker容器中,然后使用ldapjs从节点对FreeIPA容器进行身份验证。有关如何使用ldapjs对FreeIPA进行身份验证的示例,请参见下面的代码。
const LDAP = require('ldapjs');
class LDAPAuth {
constructor({url, base, uid}) {
this.errorCount = 0
setInterval(()=>this.errorCount = 0, 10000)
let self = this
function createLdap() {
self.ldap = LDAP.createClient({url})
.on('error', (error)=> {
console.error('Error in ldap',error)
self.errorCount++
if (self.errorCount > 20) {
console.error('Too many errors! Giving up...')
process.exit()
} else {
createLdap()
}
})
}
createLdap()
this.base = base
this.uid = uid
}
authenicate({username, password, count = 0}) {
let dn = `${this.uid}=${username},${this.base}`
if (count > 5) {
return Promise.reject('Failed to authenticate with LDAP!')
}
return new Promise((resolve, reject)=> {
this.ldap.bind(dn, password, (err, res) => {
if (err) {
if (err && err.stack && err.stack.indexOf(`${this.url} closed`) > -1) {
count++
// wait 1 second to give the ldap error handler time to reconnect
return setTimeout(()=>resolve(this.authenicate({username, password})), 2000)
}
console.error('ldap error', err)
reject(err)
}
if (res) resolve()
else reject()
})
})
}
}
module.exports = LDAPAuth
注意:该代码示例有问题,我现在不会以这种方式编写,但是已经运行了好几年,因此除非有需要,否则不要接触它。
答案 1 :(得分:0)
也许有点晚了,但是您可以轻松扩展node-radius-server来应对OTP。