MailLandDocs
Cuenta

Autenticación de Dos Factores

Proteja su cuenta con autenticación de dos factores (2FA) basada en TOTP

Añada una capa adicional de seguridad a su cuenta de MailLand con la autenticación de dos factores basada en TOTP. Una vez activada, el inicio de sesión requiere tanto su contraseña como un código temporal generado por una aplicación de autenticación.

Configurar la 2FA

Iniciar la configuración

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..."

Devuelve un secreto TOTP, un código QR y sus códigos de respaldo:

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"
  ]
}
CampoTipoDescripción
secretstringSecreto TOTP codificado en Base32 (para ingreso manual)
secretMaskedstringForma enmascarada del secreto, segura para mostrar en logs/UI
otpAuthUristringURI para aplicaciones de autenticación
qrCodeDataUristringImagen del código QR como data URI
backupCodesstring[]10 códigos de respaldo de un solo uso, de 8 caracteres cada uno (A-Z2-9)

Guarde los 10 códigos de respaldo ahora: la respuesta de configuración es el único lugar donde se muestran alguna vez. enable solo confirma que 2FA está activo; no vuelve a devolver los códigos.

Escanee el código QR con una aplicación de autenticación (Google Authenticator, Authy, 1Password, etc.) o ingrese el secreto manualmente.

Activar la 2FA

Confirme la configuración proporcionando un código de su aplicación de autenticación:

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"
}

La respuesta de enable no repite los códigos de respaldo: solo se mostraron una vez, en la respuesta de configuración anterior. Cada código puede utilizarse una vez para iniciar sesión si pierde el acceso a su aplicación de autenticación.

Verificar un código

Cuando el inicio de sesión devuelve requiresTwoFactor: true, complete la autenticación verificando un código TOTP:

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

trustDevice es opcional. Si es true, el dispositivo se recuerda durante 30 días y la 2FA se omite en inicios de sesión posteriores desde él.

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
}

No hay expiresIn ni un objeto user en esta respuesta. deviceTrusted es true cuando trustDevice fue true. El token del dispositivo nunca va en el cuerpo: la API lo establece como la cookie HttpOnly __Host-trusted_device, y el navegador lo envía en el siguiente inicio de sesión.

Usar un código de respaldo

Si pierde el acceso a su aplicación de autenticación, utilice un código de respaldo en su lugar:

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

El campo es code (8–10 caracteres), no 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"
  }'

Devuelve la misma respuesta que la verificación TOTP. Cada código de respaldo solo puede utilizarse una vez.

Regenerar códigos de respaldo

Genere un nuevo conjunto de códigos de respaldo (invalida todos los códigos anteriores). Requiere un código TOTP actual:

POST https://api.mail.land/v1/auth/2fa/backup-codes/regenerate
Solicitud de regeneración de códigos de respaldo
{
  "code": "123456"
}
Regenerar códigos de respaldo
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"}'
Respuesta de regeneración de códigos de respaldo
[
  "X2Y3Z4A5",
  "B6C7D8E9",
  "F2G3H4J5",
  "K6L7M8N9",
  "P2Q3R4S5",
  "T6U7V8W9",
  "X6Y7Z8A9",
  "B2C3D4E5",
  "F6G7H8J9",
  "K2L3M4N5"
]

La respuesta es un arreglo JSON simple de cadenas, no { "backupCodes": [...] }.

Verificar el estado de la 2FA

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
}

Dispositivos de confianza

Al verificar la 2FA, el dispositivo puede recordarse para omitir la 2FA en futuros inicios de sesión desde el mismo navegador.

Listar dispositivos de confianza

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
  }
]

La respuesta es un arreglo simple, no { "devices": [...] }, y los campos son deviceName, ipAddress, expiresAt e isCurrent en lugar de name.

Revocar un dispositivo

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

Devuelve 204 en caso de éxito, o 404 RESOURCE_NOT_FOUND si el id del dispositivo no pertenece al usuario actual.

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

Revocar todos los dispositivos

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..."

Revoca todos los dispositivos de confianza, requiriendo verificación 2FA en el próximo inicio de sesión desde cada dispositivo.

Cambiar la contraseña, restablecerla y cerrar la sesión en todas partes (POST /v1/auth/revoke-all-tokens) también revocan todos los dispositivos de confianza, del mismo modo.

Deshabilitar la 2FA

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"}'

Requiere un código TOTP o de respaldo válido para confirmar la acción: primero se intenta un código TOTP, y un código de respaldo solo se acepta si la verificación TOTP falla. Deshabilitar la 2FA invalida todos los códigos de respaldo y dispositivos de confianza.

Respuestas de error

La mayoría de los fallos (código inválido o expirado, estado incorrecto, código de respaldo reutilizado) devuelven 400 INVALID_REQUEST con un mensaje. Un cuerpo de solicitud malformado (longitud de código incorrecta, challengeId faltante, etc.) falla primero la validación de campos y devuelve 400 VALIDATION_FAILED en su lugar. Un dispositivo desconocido devuelve 404 RESOURCE_NOT_FOUND. No existe un código separado como INVALID_CODE, TWO_FACTOR_* o CHALLENGE_EXPIRED.

EstadoCódigoDescripción
400INVALID_REQUESTCódigo inválido o expirado, estado incorrecto, código de respaldo reutilizado, etc.
400VALIDATION_FAILEDEl cuerpo de la solicitud falló la validación de campos (p. ej. longitud de código incorrecta, campo faltante)
404RESOURCE_NOT_FOUNDDispositivo no encontrado

Pasos siguientes

En esta página