fbpx
Get In Touch
1201 3rd Avenue Seattle, WA 98101, US
(HQ) Av. Punto Sur 31, Tlajomulco de Zúñiga, Jal 45050, MX
Carrera 11B # 99 - 25, Btá, 110221, CO
Let's talk
hello@inmediatum.com
Ph: +1 (650) 603 0883
Sales attention M - F 9am - 5pm (CT)
Get support
Careers
Endless inspiration and meaningful work
See open positions
Back

Como agregar autenticación multifactor a mi proyecto con NodeJS

La autenticación multifactor combina dos credenciales independientes: lo que sabe el usuario (contraseña), lo que tiene el usuario (token de seguridad). Muchas veces es necesario implementarlo en nuestras aplicaciones para incrementar la seguridad de la misma, en este post te mostraremos como implementar autenticación multifactor de manera muy sencilla y desde cero, utilizaremos NodeJS y para el auth usaremos la app de Google Authenticator para la autenticación multifactor.

Creación de API
const express = require('express');
const bodyParser = require('body-parser');
const speakeasy = require('speakeasy');
const QRCode = require('qrcode');

const app = express();
const port = "8900";

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.listen(port, ()=>{
    console.log('server listening on port '+ port)
})
Registro y generación de QR

Lo primero es generar un QR y un código para que Google Authenticator reconozca nuestro login, esto se hace de manera muy sencilla:

app.get('/register', (req, res) => {

    const secret = speakeasy.generateSecret();

    QRCode.toDataURL(secret.otpauth_url, (err, dataUrl) => {

        if(err || !dataUrl)

            return reject(err)

        res.json({ secret: secret.base32, qrCode: dataUrl})

    });

})

Esto nos devuelve algo como esto:

{

     secret: <code>

     qrCode: <img-qr>

}
Esto sirve para registrar nuestra app en Google Authenticator, una vez descargada la aplicación escaneamos ese Codigo QR y ahora nos estará arrojando un token que estará cambiando  durante el paso del tiempo.
Verificar token

Ahora solo nos queda verificar los token de google, para eso tendremos otro endpoint que se encargara de ellos.

app.get("/validate/:token/:secret", (req, res) => {
    const { token, secret } = req.params;
    const tokenValidates = speakeasy.totp.verify({
        secret,
        encoding: 'base32',
        token
    });

    res.json( tokenValidates );
})

Este endpoint nos regresará un True si el token enviado es valido y un False si el token es invalido.

Puntos a considerar
  • El secret code es necesario almacenarlo para casa usuario de tu base de datos ya que cada que se valida un token es necesario tener el token a la mano.
  • Para implementaciones más concretas aquí esta la documentación https://www.npmjs.com/package/speakeasy

Este articulo puede interesarle loT y la seguridad del home office

Luis Estrada
Luis Estrada

We use cookies to give you the best experience. Cookie Policy