Tutorial · Use-case

Wachtwoordreset en 2FA-code per e-mail versturen

Wachtwoordresets en tweestapsverificatie zijn klassieke transactionele e-mails, en tegelijk de berichten waar beveiliging het meest telt. In deze tutorial laten we de flow zien en de keuzes die je veilig houden.

Overzicht

De flow in het kort

1

Verzoek

De gebruiker vraagt een reset of logt in met 2FA.

2

Token

Je genereert een eenmalig token of een code met een cryptografisch veilige generator.

3

Opslaan

Je slaat een gehashte versie op met een korte vervaltijd.

4

Mailen

Je stuurt de link of de code naar de gebruiker.

5

Verbruiken

Bij gebruik controleer je het token en maak je het direct ongeldig.

Code

Wachtwoordreset versturen

email/reset.ts
import { Wesender } from "@wesender/node"

const ws = new Wesender(process.env.WS_API_KEY!)

export async function stuurResetMail(to: string, resetUrl: string) {
  return ws.emails.send({
    from:    "noreply@joudomein.nl",
    to,
    subject: "Stel je wachtwoord opnieuw in",
    html:    `
      <p>
        Klik op de link hieronder om je wachtwoord te resetten.
        <strong>De link verloopt over 30 minuten.</strong>
      </p>
      <p><a href="${resetUrl}">Wachtwoord resetten</a></p>
      <p>Heb jij dit niet aangevraagd? Dan hoef je niets te doen.</p>
    `,
  })
}
Code

2FA-code versturen

email/2fa.ts
export async function stuur2faCode(to: string, code: string) {
  return ws.emails.send({
    from:    "noreply@joudomein.nl",
    to,
    subject: "Je inlogcode",
    html:    `
      <p>Je code is <strong style="font-size:1.5em">${code}</strong>.</p>
      <p>Hij is <strong>5 minuten</strong> geldig. Gebruik hem maar één keer.</p>
    `,
  })
}
Beveiliging

Beveiligingstips

Bij reset en 2FA zijn dit de keuzes die tellen:

  • Laat tokens en codes snel verlopen: een reset binnen 30 minuten, een 2FA-code binnen 5 minuten.
  • Maak een token of code eenmalig: na gebruik direct ongeldig maken.
  • Sla resettokens gehasht op met een veilig hash-algoritme, nooit als platte tekst.
  • Beperk het aantal verzoeken per tijdsperiode zodat misbruik moeilijk wordt.
  • Onthul niet of een e-mailadres bestaat. Toon altijd dezelfde bevestiging.
  • Zorg dat deze mails daadwerkelijk aankomen. Het zijn juist de berichten waar alles van afhangt.
Veelgestelde vragen

Vragen

Hoe lang mag een resetlink geldig zijn?
Zo kort mogelijk. 30 minuten is gangbaar voor een wachtwoordreset, 5 à 10 minuten voor een 2FA-code. Hoe langer de link geldig is, hoe groter het risico als hij toch in verkeerde handen valt.
Moet ik onthullen of een e-mailadres bestaat?
Nee. Toon altijd dezelfde bevestiging, ongeacht of er een account bij het adres hoort. Anders geef je informatie weg die aanvallers kunnen misbruiken.
Hoe sla ik een resettoken op?
Sla nooit het token zelf op, maar een cryptografische hash ervan (zoals bcrypt of argon2). Gebruik een cryptografisch veilige generator (crypto.randomBytes in Node, secrets.token_urlsafe in Python).
Verder lezen

Gerelateerde artikelen

Transactionele e-mail versturen?

3.000 e-mails per maand gratis. Data in Europese datacenters.