Sicurezza avanzata:
MFA in pochi minuti
I modelli di sicurezza basati su password singola hanno un problema strutturale: basta una credenziale rubata e tutto il sistema crolla. Non stiamo parlando di scenari distopici. L'uso di credenziali rubate è il cuore degli attacchi alle applicazioni web (fonte Verizon DBIR) e la VPN, da sola, non ferma un attacco che parte da un account valido. Se il tuo sistema non verifica chi sta facendo cosa ad ogni azione critica possono nascere seri problemi.
In questo articolo implementeremo un flusso MFA (Multi-Factor Authentication) completo basato su TOTP, utilizzando la libreria Open Source `@volcanicminds/tools`.
Vedremo la generazione del segreto, la creazione del QR code, la verifica del token e la generazione di codici per il testing. Tutto in poche righe di TypeScript.
Potenzialmente, i codici via SMS sono vulnerabili al SIM swapping e agli attacchi man-in-the-middle sulla rete cellulare. Il TOTP (Time-based One-Time Password) risolve il problema alla radice perché il segreto vive solo sul dispositivo dell'utente e sul server, senza transitare su reti esterne.
È lo standard RFC 6238 e funziona con Google Authenticator, Authy, 1Password e qualsiasi app compatibile. E come se non bastasse, non ha dipendenze da terze parti (per l'invio degli SMS) e non richiede abbonamenti o ulteriori costi di invio messaggio.
Il pacchetto è disponibile su npm e richiede Node.js 24+ con un progetto ESM.
npm install @volcanicminds/toolsNel vostro package.json assicuratevi di avere il caro "type": "module".
L'import mirato evita di caricare moduli che non servono (tree-shaking nativo).
Il primo passo è creare un segreto per l'utente. Questo segreto va salvato nel database in modo criptato e associato all'account.
// tree-shaking
import * as mfa from "@volcanicminds/tools/mfa";
// Generate a standalone secret (useful if you need to store it before full setup)
const secret = mfa.generateSecret();
console.log(secret); // e.g. "JBSWY3DPEHPK3PXP"In molti casi non ti serve questo passaggio separatamente perché `generateSetupDetails` (prossimo Step) lo genera in automatico se non lo passate.
Ma avere a disposizione il metodo generateSecret è utile in diversi scenari.
Qui avviene la magia. Con una singola chiamata otteniamo il segreto, l'URI otpauth e il QR code pronto da mostrare nel frontend.
const setup = await mfa.generateSetupDetails(
"AppName", // issuer (the name shown in the authenticator app)
"user@company.com", // user account
secret, // optional: if omitted, a new one is generated
);
// What we get:
console.log(setup.secret); // base32 secret, store encrypted in DB
console.log(setup.qrCode); // QR code data URL (base64), ready for <img> tagIl `setup.qrCode` restituisce un Data URL che potete iniettare direttamente in un tag img senza bisogno di librerie frontend aggiuntive.
Quando l'utente apre la sua app authenticator e inserisce il codice a 6 cifre, la verifica è immediata.
const userToken = "483920"; // the code entered by the user
const isValid = mfa.verifyToken(userToken, setup.secret);
if (isValid) {
// Proceed with login or protected action
} else {
// Invalid or expired token
}Il metodo gestisce internamente la finestra temporale del TOTP (di norma 30 secondi). Non bisogna preoccuparsi di gestire clock drift o scadenze, è tutto incapsulato.
Scrivere test automatizzati quando si passa dall'MFA è fastidioso, quindi come simuli un codice valido senza aprire un'app authenticator? Così:
const currentToken = mfa.generateToken(setup.secret);
console.log(currentToken); // es. "847291" (valido per ~30 secondi)Questo metodo è pensato per i vostri test end-to-end e per generare codici di recovery. Niente workaround, niente mock complessi.
Messi insieme, questi metodi coprono il ciclo di vita dell'MFA. Dalla registrazione dell'utente al login protetto, dal recovery al testing automatico. L'architettura è volutamente minimale e non vi vincola a nessun framework specifico. Funziona con Express, Fastify, Nuxt, NestJS o qualsiasi altro stack Node.js.
Certo, quando si parla di MFA c'è di più ma questo articolo è volutamente minimale per far capire che anche con poco è possibile aumentare le sicurezza di una paittaforma Enterprise senza pregiudicare tempi e costi di sviluppo.
Questo è esattamente quello che intendiamo quando parliamo di Security by Design. Il secondo fattore non è un plugin costoso che compri, configuri e speri che funzioni. È codice che vive nel progetto, che si può ispezionare, testare e controllare. Possiamo governare il rischio.
No, la libreria `@volcanicminds/tools` non si ferma all'MFA. Include moduli per il mailing (Mailer con nodemailer semplificato), logging strutturato (Pino), storage S3/Minio, upload resumable (Tus.io) e un modulo AI per integrare provider come OpenAI, Anthropic e Google Gemini (Mastra inside).
Per ulteriori informazioni si possono consultare le seguenti risorse:
Se vi serve un assessment sull'architettura di sicurezza del vostro sistema, o se dovete implementare un flusso MFA completo nelle vostre applicazioni, contattateci per una revisione tecnica.
Data pubblicazione: 23 marzo 2026
Ultima revisione: 23 marzo 2026