L'autenticazione a due fattori (2FA) aggiunge un ulteriore livello di sicurezza al processo di login, richiedendo non solo le credenziali dell'utente ma anche un secondo fattore, come un codice temporaneo generato da un'app di autenticazione.
Prerequisiti
- Node.js installato
- Un'app come Google Authenticator o Authy
- Un progetto Node.js esistente
1. Installazione dei pacchetti necessari
npm install speakeasy qrcode express body-parser
Questi pacchetti servono per:
- speakeasy: generazione e verifica dei token TOTP
- qrcode: generazione del QR code da scansionare
- express: creazione del server
- body-parser: parsing del corpo delle richieste
2. Configurazione base del server
const express = require('express');
const bodyParser = require('body-parser');
const speakeasy = require('speakeasy');
const qrcode = require('qrcode');
const app = express();
app.use(bodyParser.json());
let temp_secret, user_secret;
3. Generazione del secret e QR code
Quando l’utente abilita il 2FA, generiamo un secret e un QR code da scansionare con l’app di autenticazione.
app.get('/generate', (req, res) => {
const secret = speakeasy.generateSecret({ name: 'MyAppName' });
temp_secret = secret;
qrcode.toDataURL(secret.otpauth_url, (err, data_url) => {
res.json({ qr: data_url, secret: secret.base32 });
});
});
4. Verifica del token
Quando l’utente inserisce il codice generato dalla sua app, verifichiamo se è corretto.
app.post('/verify', (req, res) => {
const { token } = req.body;
const verified = speakeasy.totp.verify({
secret: temp_secret.base32,
encoding: 'base32',
token,
window: 1
});
if (verified) {
user_secret = temp_secret;
res.send('2FA abilitato con successo!');
} else {
res.status(400).send('Token non valido');
}
});
5. Verifica continua del token al login
Quando un utente accede, confrontiamo il token inserito con il secret salvato.
app.post('/login-2fa', (req, res) => {
const { token } = req.body;
const verified = speakeasy.totp.verify({
secret: user_secret.base32,
encoding: 'base32',
token,
window: 1
});
if (verified) {
res.send('Accesso riuscito con 2FA!');
} else {
res.status(400).send('Token errato o scaduto');
}
});
6. Avvio del server
app.listen(3000, () => {
console.log('Server avviato su http://localhost:3000');
});
Conclusione
Con pochi semplici passaggi, abbiamo integrato il 2FA nel nostro progetto Node.js. È importante salvare in modo sicuro i secret degli utenti e utilizzare HTTPS per tutte le comunicazioni. Per progetti in produzione, è raccomandato salvare i secret in un database sicuro e gestire con attenzione i timeout e le finestre di validità dei token.