Laboratorio: Implementación de Doble Factor de Autenticación (2FA) con Google Authenticator

En este laboratorio, aprenderemos a implementar la doble autenticación (2FA) utilizando Google Authenticator en una aplicación Node.js. Usaremos las bibliotecas speakeasy y qrcode para generar secretos y códigos QR.

Objetivos

  • Entender el concepto de doble factor de autenticación (2FA).
  • Implementar 2FA en una aplicación Node.js.
  • Generar y verificar tokens de Google Authenticator.

Prerrequisitos

  • Conocimientos básicos de JavaScript y Node.js.
  • Node.js y npm instalados en tu sistema.

Paso 1: Configuración del Proyecto

Crea un nuevo directorio para tu proyecto y navega dentro de él:

mkdir 2fa-demo
cd 2fa-demo

Inicializa un nuevo proyecto Node.js:

npm init -y

Instala las dependencias necesarias:

npm install qrcode speakeasy

Paso 2: Generación del Secreto y Código QR

  • Crea un archivo index.js con el siguiente contenido:
const speakeasy = require('speakeasy');
const qrcode = require('qrcode');

// Generar un secreto
let secret = speakeasy.generateSecret({ name: "Demo 2FA" });

// Imprimir el secreto en consola
console.log(secret);

// Generar un código QR con el URL de otpauth
qrcode.toDataURL(secret.otpauth_url, function(err, data) {
    if (err) {
        console.error("Error generando el código QR", err);
        return;
    }
    console.log(data);
});

Ejecuta el script para generar el secreto y el código QR:

node .

Copia la URL del código QR que se imprime en la consola y pégala en el archivo index.html en el atributo src de la etiqueta <img>.

Paso 3: Creación del Archivo HTML

  • Crea un archivo index.html con el siguiente contenido:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Google Authenticator QR Code</title>
</head>
<body>
    <img src="AQUÍ_VA_EL_CÓDIGO_QR_GENERADO">
</body>
</html>
Tip

Utiliza la extensión Live Preview de Visual Studio Code para ver el código QR en tiempo real.

Paso 4: Verificación del Token

Crea un archivo verify.js con el siguiente contenido:

const speakeasy = require('speakeasy');

// Reemplaza 'YOUR_SECRET' con el secreto generado en el paso 2
const secret = 'YOUR_SECRET';

// Obtén el token desde Google Authenticator y reemplázalo aquí
const token = 'YOUR_TOKEN';

let verified = speakeasy.totp.verify({
    secret: secret,
    encoding: 'ascii',
    token: token
});

console.log(verified);

Reemplaza YOUR_SECRET con el secreto generado en el paso 2 y YOUR_TOKEN con el token generado en Google Authenticator.

Ejecuta el script para verificar el token:

node verify.js

Si el token es válido, verás true en la consola. Si no, verás false.

Conclusión

En este laboratorio, aprendimos cómo implementar la doble autenticación (2FA) utilizando Google Authenticator en una aplicación Node.js. Generamos un secreto y un código QR, y luego verificamos el token generado por Google Authenticator. Esta implementación proporciona una capa adicional de seguridad a las aplicaciones, ayudando a proteger contra accesos no autorizados.