Cómo implementar la autenticación de dos factores en aplicaciones web modernas

La autenticación de dos factores (2FA) es una técnica de seguridad que requiere dos métodos diferentes para verificar la identidad de un usuario. Con la creciente cantidad de violaciones de datos y ataques cibernéticos, implementar 2FA se ha convertido en un estándar primordial para la seguridad de las aplicaciones web modernas. En este artículo, exploraremos cómo implementar 2FA utilizando Node.js y la biblioteca Passport.js.

¿Por qué es importante la autenticación de dos factores?

Usar solo una contraseña puede ser insuficiente, ya que los atacantes pueden obtenerla a través de phishing u otros métodos. 2FA añade una capa adicional de seguridad cásando que un atacante tenga acceso tanto a la contraseña como al segundo factor, que generalmente es un código enviado a un dispositivo del usuario.

Componentes necesarios

  • Node.js como entorno de servidor.
  • Express para el enrutamiento y manejo de peticiones HTTP.
  • Passport.js para la autenticación.
  • Twilio o cualquier otro servicio SMS para el envío de códigos.
  • MongoDB o cualquier base de datos para almacenar usuarios.

Configuración del entorno

Primero, asegúrate de tener Node.js instalado en tu sistema. Luego, crea un nuevo proyecto de Node.js e instala las dependencias necesarias:

npm init -y
npm install express passport passport-local express-session twilio mongoose

Implementación de la autenticación de dos factores

1. Configurar la base de datos

Crea un esquema simple de usuario en MongoDB:

const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
    username: String,
    password: String,
    phone: String,
    twoFactorCode: String
});
const User = mongoose.model('User', UserSchema);

2. Configurar Passport.js

Configura Passport.js para manejar la autenticación:

const LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy((username, password, done) => {
    User.findOne({ username }, (err, user) => {
        if (err) return done(err);
        if (!user || user.password !== password) {
            return done(null, false);
        }
        return done(null, user);
    });
}));

3. Envío del código de verificación

Una vez que el usuario se autentique correctamente, genera un código 2FA y envíalo al teléfono del usuario:

const twilioClient = require('twilio')(accountSid, authToken);

function sendTwoFactorCode(user) {
    const code = Math.floor(100000 + Math.random() * 900000).toString();
    user.twoFactorCode = code;
    user.save();
    twilioClient.messages.create({
        body: `Your verification code is ${code}`,
        to: user.phone,
        from: twilioPhoneNumber
    });
}

4. Verificar el código ingresado

Finalmente, verifica si el código ingresado por el usuario coincide con el enviado:

app.post('/verify', (req, res) => {
    const { code } = req.body;
    User.findById(req.user._id, (err, user) => {
        if (user.twoFactorCode === code) {
            // Autenticación exitosa
            req.session.authenticated = true;
            res.send('Authenticated successfully!');
        } else {
            res.send('Invalid code!');
        }
    });
});

Conclusión

Implementar la autenticación de dos factores en tu aplicación web mejora significativamente su seguridad. Ayuda a proteger a los usuarios y sus datos sensibles. En este artículo, aprendiste cómo implementar 2FA utilizando Node.js y Passport.js. Te animamos a seguir explorando cómo puedes mejorar la seguridad de tus aplicaciones utilizando técnicas innovadoras.