Sicurezza avanzata:
MFA in pochi minuti

Detailed mobile app screen for identity verification, displaying code input form and continue button - Volcanic Minds Article.

Un'autenticazione ferma alla password

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.

Perché TOTP e non SMS?

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.

Setup del progetto

Il pacchetto è disponibile su npm e richiede Node.js 24+ con un progetto ESM.

npm install @volcanicminds/tools

Nel vostro package.json assicuratevi di avere il caro "type": "module".

L'import mirato evita di caricare moduli che non servono (tree-shaking nativo).

Step 1: generare il segreto

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.

Step 2: generare il QR code per l'utente

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> tag

Il `setup.qrCode` restituisce un Data URL che potete iniettare direttamente in un tag img senza bisogno di librerie frontend aggiuntive.

Step 3: verificare il token dell'utente

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.

Step 4: generare token per il testing

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.

Conclusione

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.

Tutto qui?

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:

red circle left decoration violet circle right decoration

Serve una consulenza sulla sicurezza?

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.

Condividi l'articolo

Tag: Development

Data pubblicazione: 23 marzo 2026

Ultima revisione: 23 marzo 2026