Email di reimpostazione password affidabili (e che arrivano in inbox)

Crea un flusso di reimpostazione password sicuro: token monouso, scadenza breve, nessuna enumerazione degli account, un template chiaro e un’email di conferma.

L’email di reimpostazione della password è la chiave maestra del tuo prodotto. Chiunque riesca a leggerla può prendere il controllo dell’account: per questo gli attaccanti la prendono di mira, e per questo gli utenti hanno imparato a diffidarne.

Un buon flusso di reimpostazione deve essere abbastanza sicuro da resistere a quegli attaccanti e abbastanza chiaro da ispirare fiducia agli utenti reali in pochi secondi. Questa guida affronta entrambi gli aspetti, dal momento in cui qualcuno fa clic su “Password dimenticata?” fino all’email di conferma dopo la modifica.

Il flusso in sintesi

  1. L’utente inserisce la propria email nella pagina Password dimenticata.
  2. La tua app mostra sempre lo stesso messaggio, che l’account esista o meno.
  3. Se l’account esiste, crei un token monouso e invii via email un link di reimpostazione.
  4. L’utente apre il link, sceglie una nuova password e il token viene consumato.
  5. Disconnetti le altre sessioni dell’utente e invii un’email “la tua password è stata modificata”.

Passo 1: non rivelare chi ha un account

Dopo l’invio del modulo, rispondi sempre con lo stesso testo:

Se esiste un account per ada@example.com, ti abbiamo inviato un link per reimpostare la password. Scade tra 30 minuti.

Mostrare invece “Nessun account con questa email” rivela a chiunque abbia un elenco di indirizzi esattamente quali usano il tuo prodotto. Mantieni simile anche il tempo di risposta: esegui la ricerca dell’account e l’invio dell’email in background, così la pagina non risponde sensibilmente più in fretta per gli indirizzi sconosciuti.

Passo 2: crea un token robusto e monouso

Il token nel link deve essere lungo, casuale e impossibile da indovinare:

import { randomBytes, createHash } from 'node:crypto';

const token = randomBytes(32).toString('base64url');            // goes in the email
const tokenHash = createHash('sha256').update(token).digest('hex'); // goes in the database

await db.passwordResets.upsert({
  userId: user.id,
  tokenHash,
  expiresAt: new Date(Date.now() + 30 * 60 * 1000), // 30 minutes
});

Le regole:

  • Conserva solo un hash del token, così una fuga del database non distribuisce link di reimpostazione funzionanti.
  • Un solo token attivo per utente. Emetterne uno nuovo sostituisce il precedente.
  • Scadenza breve: in genere da 15 a 60 minuti.
  • Monouso. Elimina il token appena la password viene modificata.
  • Invalidalo se nel frattempo l’utente accede correttamente o cambia il proprio indirizzo email.

Passo 3: invia subito l’email

L’utente è in attesa, quindi invia nella richiesta stessa, non in un job batch:

import os
import requests

def send_reset_email(user, token):
    link = f"https://app.yourco.com/reset-password/{token}"
    res = requests.post(
        "https://backend.inbixio.com/api/send-email/",
        headers={"X-API-Key": os.environ["INBIXIO_API_KEY"]},
        json={
            "to_email": user.email,
            "subject": "Reset your YourApp password",
            "message": render_reset_template(name=user.first_name, link=link, minutes=30),
        },
        timeout=10,
    )
    res.raise_for_status()

Invia da un indirizzo dedicato e autenticato, come security@yourco.com. In Inbixio, collega quella casella come server email a sé e assegna al servizio di autenticazione una chiave API associata a quel server, così le email di reimpostazione arrivano dall’indirizzo che gli utenti si aspettano. Se un giorno rimuovi quel server, riassocia la chiave. Consulta sicurezza delle chiavi API per la configurazione.

Passo 4: un’email che ispiri fiducia

Le email di phishing imitano le reimpostazioni della password più di qualsiasi altro messaggio. Rendi la tua inconfondibile:

  • Oggetto: semplice e specifico, ad esempio “Reimposta la password di YourApp”. Niente urgenza, niente punti esclamativi.
  • Un solo pulsante chiaro, più il link completo in forma di testo per i client che bloccano i pulsanti.
  • La scadenza: “Questo link scade tra 30 minuti.”
  • Il contesto: quando è stata fatta la richiesta e, se lo sai, da quale browser o città.
  • Cosa fare se non sono stati loro: “Se non hai chiesto di reimpostare la password, puoi ignorare questa email. La tua password non cambierà.”
  • Nessun altro link, immagine o promozione. Meno link ci sono, più è facile verificare l’email.
<div style="font-family:system-ui,sans-serif;max-width:520px;margin:auto;color:#111;line-height:1.5">
  <p>Hi Ada,</p>
  <p>We received a request to reset the password for your YourApp account.</p>
  <p style="margin:28px 0">
    <a href="https://app.yourco.com/reset-password/TOKEN"
       style="background:#584efe;color:#fff;padding:12px 20px;border-radius:8px;text-decoration:none;font-weight:600">
      Choose a new password
    </a>
  </p>
  <p>This link expires in 30 minutes and can only be used once.</p>
  <p>If you didn't ask to reset your password, you can safely ignore this email.</p>
  <p style="color:#666;font-size:13px">Button not working? Paste this link into your browser:<br>
    https://app.yourco.com/reset-password/TOKEN</p>
</div>

Quando l’utente apre il link:

  • Cerca l’hash del token, verifica che non sia scaduto e mostra il modulo per la nuova password. Non far ancora accedere l’utente.
  • Tieni il token fuori dalle richieste verso terze parti. Aggiungi <meta name="referrer" content="no-referrer"> alla pagina di reimpostazione e non caricare lì script di analytics o pubblicitari, così il token nell’URL non trapela tramite gli header referrer.
  • All’invio del modulo, verifica la nuova password rispetto alle tue regole, calcolane l’hash con un algoritmo lento (bcrypt, scrypt o Argon2), elimina il token e disconnetti ogni altra sessione.

Passo 6: conferma la modifica

Dopo una modifica della password invia sempre una breve conferma:

La password di YourApp è stata modificata il 28 ottobre alle 14:32 UTC. Se sei stato tu, non devi fare altro. In caso contrario, metti subito al sicuro il tuo account.

Questa email è il campanello d’allarme dell’utente se qualcun altro è entrato, quindi non saltarla mai.

Assicurati che arrivi

Un’email di reimpostazione nello spam è un ticket di assistenza. Prima del lancio:

  • configura SPF, DKIM e DMARC per il tuo dominio di invio,
  • fai una prova con indirizzi Gmail e Outlook e verifica che gli header mostrino PASS, e
  • tieni d’occhio la percentuale Failed Deliveries (recapiti non riusciti) nella dashboard di Inbixio dopo il deploy.

Checklist

  • Stessa risposta per email esistenti e sconosciute
  • Token casuale di 32 byte, conservato solo il suo hash
  • Scadenza di 15–60 minuti, monouso, un solo token attivo per utente
  • Invio immediato da un mittente dedicato e autenticato
  • Template chiaro: un pulsante, link in chiaro, scadenza, riga “non sei stato tu?”
  • Nessuno script di terze parti nella pagina di reimpostazione; referrer disattivato
  • Altre sessioni disconnesse ed email di conferma inviata dopo la modifica

Invialo con Inbixio

Collega il tuo server SMTP, crea una chiave API con permessi mirati e invia da qualsiasi linguaggio con una sola richiesta HTTPS.

Crea un account Vedi i prezzi