MailLandDocs
Konto

Zwei-Faktor-Authentifizierung

Sichern Sie Ihr Konto mit TOTP-basierter Zwei-Faktor-Authentifizierung (2FA)

Fügen Sie Ihrem MailLand-Konto eine zusätzliche Sicherheitsebene mit TOTP-basierter Zwei-Faktor-Authentifizierung hinzu. Wenn aktiviert, erfordert die Anmeldung sowohl Ihr Passwort als auch einen zeitbasierten Code aus einer Authenticator-App.

2FA einrichten

Einrichtung initiieren

POST https://api.mail.land/v1/auth/2fa/setup
Setup 2FA
curl -X POST https://api.mail.land/v1/auth/2fa/setup \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Gibt ein TOTP-Geheimnis, einen QR-Code und Ihre Backup-Codes zurück:

2FA setup response
{
  "secret": "JBSWY3DPEHPK3PXP",
  "secretMasked": "JBSW...3PXP",
  "otpAuthUri": "otpauth://totp/MailLand:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=MailLand",
  "qrCodeDataUri": "data:image/png;base64,iVBORw0KGgo...",
  "backupCodes": [
    "A1B2C3D4",
    "E5F6G7H8",
    "I9J0K1L2",
    "M3N4O5P6",
    "Q7R8S9T0",
    "U1V2W3X4",
    "Y5Z6A7B8",
    "C9D0E1F2",
    "G3H4I5J6",
    "K7L8M9N0"
  ]
}
FeldTypBeschreibung
secretstringBase32-kodiertes TOTP-Geheimnis (zur manuellen Eingabe)
secretMaskedstringMaskierte Form des Geheimnisses, sicher für Logs/UI
otpAuthUristringURI für Authenticator-Apps
qrCodeDataUristringQR-Code-Bild als Data-URI
backupCodesstring[]10 Einmal-Backup-Codes mit je 8 Zeichen (A-Z2-9)

Speichern Sie die 10 Backup-Codes jetzt: die Setup-Antwort ist der einzige Ort, an dem sie jemals angezeigt werden. enable bestätigt nur, dass 2FA aktiv ist; es gibt die Codes nicht erneut zurück.

Scannen Sie den QR-Code mit einer Authenticator-App (Google Authenticator, Authy, 1Password usw.) oder geben Sie das Geheimnis manuell ein.

2FA aktivieren

Bestätigen Sie die Einrichtung durch Angabe eines Codes aus Ihrer Authenticator-App:

POST https://api.mail.land/v1/auth/2fa/enable
Enable 2FA request
{
  "code": "123456"
}
Enable 2FA
curl -X POST https://api.mail.land/v1/auth/2fa/enable \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"code": "123456"}'
Enable 2FA response
{
  "message": "Two-factor authentication enabled successfully"
}

Die Enable-Antwort wiederholt die Backup-Codes nicht: sie wurden nur einmal in der obigen Setup-Antwort angezeigt. Jeder Code kann einmalig verwendet werden, um sich anzumelden, falls Sie den Zugriff auf Ihre Authenticator-App verlieren.

Code verifizieren

Wenn die Anmeldung requiresTwoFactor: true zurückgibt, schließen Sie die Authentifizierung durch Verifizierung eines TOTP-Codes ab:

POST https://api.mail.land/v1/auth/2fa/verify
2FA verify request
{
  "challengeId": "2fa_challenge_abc123",
  "code": "123456",
  "trustDevice": true
}

trustDevice ist optional. Bei true wird das Gerät 30 Tage lang gemerkt, und 2FA wird bei nachfolgenden Anmeldungen von diesem Gerät übersprungen.

Verify 2FA code
curl -X POST https://api.mail.land/v1/auth/2fa/verify \
  -H "Content-Type: application/json" \
  -d '{
    "challengeId": "2fa_challenge_abc123",
    "code": "123456"
  }'
2FA verify response
{
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "rt_a1b2c3d4e5...",
  "deviceTrusted": false
}

Es gibt kein expiresIn und kein user-Objekt in dieser Antwort. deviceTrusted ist true, wenn trustDevice true war. Das Geräte-Token selbst steht nie im Body: Die API setzt es als HttpOnly-Cookie __Host-trusted_device, und der Browser sendet es bei der nächsten Anmeldung mit.

Backup-Code verwenden

Falls Sie den Zugriff auf Ihre Authenticator-App verlieren, verwenden Sie stattdessen einen Backup-Code:

POST https://api.mail.land/v1/auth/2fa/verify-backup
Backup code verify request
{
  "challengeId": "2fa_challenge_abc123",
  "code": "a1b2c3d4"
}

Das Feld heißt code (8–10 Zeichen), nicht backupCode.

Verify backup code
curl -X POST https://api.mail.land/v1/auth/2fa/verify-backup \
  -H "Content-Type: application/json" \
  -d '{
    "challengeId": "2fa_challenge_abc123",
    "code": "a1b2c3d4"
  }'

Gibt dieselbe Antwort wie die TOTP-Verifizierung zurück. Jeder Backup-Code kann nur einmal verwendet werden.

Backup-Codes neu generieren

Erstellen Sie einen neuen Satz von Backup-Codes (macht alle vorherigen Codes ungültig). Erfordert einen aktuellen TOTP-Code:

POST https://api.mail.land/v1/auth/2fa/backup-codes/regenerate
Anfrage: Backup-Codes neu generieren
{
  "code": "123456"
}
Backup-Codes neu generieren
curl -X POST https://api.mail.land/v1/auth/2fa/backup-codes/regenerate \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"code": "123456"}'
Antwort: Backup-Codes neu generieren
[
  "X2Y3Z4A5",
  "B6C7D8E9",
  "F2G3H4J5",
  "K6L7M8N9",
  "P2Q3R4S5",
  "T6U7V8W9",
  "X6Y7Z8A9",
  "B2C3D4E5",
  "F6G7H8J9",
  "K2L3M4N5"
]

Die Antwort ist ein reines JSON-Array von Strings, nicht { "backupCodes": [...] }.

2FA-Status prüfen

GET https://api.mail.land/v1/auth/2fa/status
Check 2FA status
curl https://api.mail.land/v1/auth/2fa/status \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
2FA status response
{
  "isEnabled": true,
  "enabledAt": "2026-01-15T10:00:00Z",
  "backupCodesRemaining": 6,
  "trustedDevicesCount": 2
}

Vertrauenswürdige Geräte

Beim Verifizieren der 2FA kann das Gerät gespeichert werden, um die 2FA bei zukünftigen Anmeldungen von demselben Browser zu überspringen.

Vertrauenswürdige Geräte auflisten

GET https://api.mail.land/v1/auth/2fa/devices
List trusted devices
curl https://api.mail.land/v1/auth/2fa/devices \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Trusted devices response
[
  {
    "id": "dev_a1b2c3d4e5",
    "deviceName": "Chrome on macOS",
    "ipAddress": "203.0.113.10",
    "createdAt": "2026-01-20T14:00:00Z",
    "expiresAt": "2026-02-19T14:00:00Z",
    "lastUsedAt": "2026-02-17T09:00:00Z",
    "isCurrent": true
  },
  {
    "id": "dev_f6g7h8i9j0",
    "deviceName": "Firefox on Windows",
    "ipAddress": "198.51.100.24",
    "createdAt": "2026-02-01T08:00:00Z",
    "expiresAt": "2026-03-03T08:00:00Z",
    "lastUsedAt": "2026-02-16T15:30:00Z",
    "isCurrent": false
  }
]

Die Antwort ist ein reines Array, nicht { "devices": [...] }, und die Felder sind deviceName, ipAddress, expiresAt und isCurrent statt name.

Gerät widerrufen

DELETE https://api.mail.land/v1/auth/2fa/devices/{id}

Liefert bei Erfolg 204, oder 404 RESOURCE_NOT_FOUND, wenn die Geräte-ID nicht dem aktuellen Benutzer gehört.

Revoke a device
curl -X DELETE https://api.mail.land/v1/auth/2fa/devices/dev_a1b2c3d4e5 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Alle Geräte widerrufen

DELETE https://api.mail.land/v1/auth/2fa/devices
Revoke all devices
curl -X DELETE https://api.mail.land/v1/auth/2fa/devices \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Widerruft alle vertrauenswürdigen Geräte, sodass bei der nächsten Anmeldung von jedem Gerät eine 2FA-Verifizierung erforderlich ist.

Eine Passwortänderung, das Zurücksetzen des Passworts und die Abmeldung überall (POST /v1/auth/revoke-all-tokens) widerrufen ebenso alle vertrauenswürdigen Geräte.

2FA deaktivieren

POST https://api.mail.land/v1/auth/2fa/disable
Disable 2FA request
{
  "code": "123456"
}
Disable 2FA
curl -X POST https://api.mail.land/v1/auth/2fa/disable \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"code": "123456"}'

Erfordert einen gültigen TOTP- oder Backup-Code zur Bestätigung der Aktion: Zuerst wird ein TOTP-Code versucht, ein Backup-Code wird nur akzeptiert, wenn die TOTP-Prüfung fehlschlägt. Das Deaktivieren der 2FA macht alle Backup-Codes und vertrauenswürdige Geräte ungültig.

Fehlerantworten

Die meisten Fehlschläge (ungültiger oder abgelaufener Code, falscher Zustand, wiederverwendeter Backup-Code) liefern 400 INVALID_REQUEST mit einer Meldung. Ein fehlerhafter Request-Body (falsche Code-Länge, fehlende challengeId usw.) scheitert zuerst an der Feldvalidierung und liefert stattdessen 400 VALIDATION_FAILED. Ein unbekanntes Gerät liefert 404 RESOURCE_NOT_FOUND. Es gibt keinen separaten Code wie INVALID_CODE, TWO_FACTOR_* oder CHALLENGE_EXPIRED.

StatusCodeBeschreibung
400INVALID_REQUESTUngültiger oder abgelaufener Code, falscher Zustand, wiederverwendeter Backup-Code usw.
400VALIDATION_FAILEDRequest-Body hat die Feldvalidierung nicht bestanden (z. B. falsche Code-Länge, fehlendes Feld)
404RESOURCE_NOT_FOUNDGerät nicht gefunden

Nächste Schritte

Auf dieser Seite