MailLandDocs
حساب کاربری

احراز هویت دو مرحله‌ای

حساب کاربری خود را با احراز هویت دو مرحله‌ای مبتنی بر TOTP ایمن کنید

با استفاده از احراز هویت دو مرحله‌ای مبتنی بر TOTP، یک لایه امنیتی اضافی به حساب MailLand خود اضافه کنید. پس از فعال‌سازی، ورود به سیستم به هر دو مورد نیاز دارد: رمز عبور و یک کد زمان‌محور از برنامه احراز هویت.

راه‌اندازی 2FA

آغاز راه‌اندازی

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

یک رمز TOTP، کد QR، و کدهای پشتیبان شما را برمی‌گرداند:

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"
  ]
}
فیلدنوعتوضیحات
secretstringرمز TOTP کدگذاری‌شده با Base32 (برای ورود دستی)
secretMaskedstringنسخه‌ی پوشیده‌شده‌ی رمز، امن برای نمایش در لاگ/رابط کاربری
otpAuthUristringURI برای برنامه‌های احراز هویت
qrCodeDataUristringتصویر کد QR به صورت data URI
backupCodesstring[]۱۰ کد پشتیبان یک‌بارمصرف، هرکدام ۸ کاراکتری (A-Z2-9)

۱۰ کد پشتیبان را همین حالا ذخیره کنید: پاسخ setup تنها جایی است که این کدها نمایش داده می‌شوند. enable فقط فعال‌بودن ۲FA را تأیید می‌کند و کدها را دوباره برنمی‌گرداند.

کد QR را با یک برنامه احراز هویت (Google Authenticator، Authy، 1Password و غیره) اسکن کنید یا رمز را به صورت دستی وارد نمایید.

فعال‌سازی 2FA

راه‌اندازی را با ارائه یک کد از برنامه احراز هویت تأیید کنید:

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

پاسخ enable کدهای پشتیبان را دوباره نشان نمی‌دهد: آن‌ها فقط یک‌بار در پاسخ setup بالا نمایش داده شدند. در صورت از دست دادن دسترسی به برنامه احراز هویت، هر کد می‌تواند یک بار برای ورود استفاده شود.

تأیید یک کد

هنگامی که ورود به سیستم requiresTwoFactor: true برمی‌گرداند، با تأیید یک کد TOTP احراز هویت را تکمیل کنید:

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

trustDevice اختیاری است. زمانی که true باشد، دستگاه به مدت ۳۰ روز به خاطر سپرده می‌شود و ۲FA در ورودهای بعدی از آن دستگاه نادیده گرفته می‌شود.

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
}

هیچ expiresIn و هیچ آبجکت user در این پاسخ وجود ندارد. وقتی trustDevice برابر true بوده باشد، deviceTrusted برابر true است. خود توکن دستگاه هرگز در بدنهٔ پاسخ نمی‌آید: API آن را در کوکی HttpOnly به نام __Host-trusted_device قرار می‌دهد و مرورگر آن را در ورود بعدی خودش می‌فرستد.

استفاده از کد پشتیبان

در صورت از دست دادن دسترسی به برنامه احراز هویت، از یک کد پشتیبان استفاده کنید:

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

نام فیلد code است (۸ تا ۱۰ کاراکتر)، نه 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"
  }'

همان پاسخ تأیید TOTP را برمی‌گرداند. هر کد پشتیبان فقط یک بار قابل استفاده است.

بازسازی کدهای پشتیبان

مجموعه‌ای جدید از کدهای پشتیبان بسازید (همه‌ی کدهای قبلی باطل می‌شوند). به یک کد TOTP فعلی نیاز دارد:

POST https://api.mail.land/v1/auth/2fa/backup-codes/regenerate
درخواست بازسازی کدهای پشتیبان
{
  "code": "123456"
}
بازسازی کدهای پشتیبان
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"}'
پاسخ بازسازی کدهای پشتیبان
[
  "X2Y3Z4A5",
  "B6C7D8E9",
  "F2G3H4J5",
  "K6L7M8N9",
  "P2Q3R4S5",
  "T6U7V8W9",
  "X6Y7Z8A9",
  "B2C3D4E5",
  "F6G7H8J9",
  "K2L3M4N5"
]

پاسخ یک آرایه‌ی خام JSON از رشته‌هاست، نه { "backupCodes": [...] }.

بررسی وضعیت 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
}

دستگاه‌های مورد اعتماد

هنگام تأیید 2FA، دستگاه می‌تواند به خاطر سپرده شود تا در ورودهای بعدی از همان مرورگر، 2FA نیاز نباشد.

فهرست دستگاه‌های مورد اعتماد

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

پاسخ یک آرایه‌ی خام است، نه { "devices": [...] }، و فیلدها deviceName، ipAddress، expiresAt و isCurrent هستند، نه name.

لغو دسترسی یک دستگاه

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

در صورت موفقیت 204 برمی‌گرداند، یا اگر شناسه‌ی دستگاه متعلق به کاربر جاری نباشد، 404 RESOURCE_NOT_FOUND برمی‌گرداند.

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

لغو دسترسی همه دستگاه‌ها

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

دسترسی تمام دستگاه‌های مورد اعتماد را لغو می‌کند و در ورود بعدی از هر دستگاه، تأیید 2FA الزامی خواهد بود.

تغییر رمز عبور، بازنشانی آن و خروج از همهٔ نشست‌ها (POST /v1/auth/revoke-all-tokens) نیز به همین شکل دسترسی تمام دستگاه‌های مورد اعتماد را لغو می‌کنند.

غیرفعال‌سازی 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"}'

برای تأیید عملیات به یک کد TOTP یا کد پشتیبان معتبر نیاز دارد: ابتدا کد TOTP بررسی می‌شود و کد پشتیبان تنها زمانی پذیرفته می‌شود که بررسی TOTP ناموفق باشد. غیرفعال‌کردن ۲FA همه‌ی کدهای پشتیبان و دستگاه‌های مورد اعتماد را باطل می‌کند.

پاسخ‌های خطا

بیشتر شکست‌ها (کد نامعتبر یا منقضی، وضعیت اشتباه، استفاده‌ی مجدد از کد پشتیبان) کد 400 INVALID_REQUEST همراه با یک پیام برمی‌گردانند. اما بدنه‌ی درخواستِ نادرست (طول کد اشتباه، نبودِ challengeId و مانند آن) ابتدا در اعتبارسنجی فیلدها شکست می‌خورد و به‌جای آن 400 VALIDATION_FAILED برمی‌گرداند. دستگاه ناشناخته کد 404 RESOURCE_NOT_FOUND برمی‌گرداند. هیچ کد جداگانه‌ای مانند INVALID_CODE، TWO_FACTOR_* یا CHALLENGE_EXPIRED وجود ندارد.

وضعیتکدتوضیحات
400INVALID_REQUESTکد نامعتبر یا منقضی، وضعیت اشتباه، استفاده‌ی مجدد از کد پشتیبان و غیره
400VALIDATION_FAILEDبدنه‌ی درخواست اعتبارسنجی فیلدها را پاس نکرد (مثلاً طول کد اشتباه یا فیلد گم‌شده)
404RESOURCE_NOT_FOUNDدستگاه یافت نشد

مراحل بعدی

در این صفحه