NodeJS RADIUS OTP身份验证

时间:2019-02-08 13:15:38

标签: javascript node.js cas freeradius radius

我正在尝试在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#

2 个答案:

答案 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。