MailLandDocs
الحساب

المصادقة

المصادقة مع واجهة برمجة تطبيقات Mail.Land باستخدام رموز Bearer أو مفاتيح API

تدعم MailLand طريقتين للمصادقة: رموز Bearer (JWT) لجلسات المستخدمين ومفاتيح API للتكامل بين الخوادم. تتطلب جميع طلبات API المصادقة عبر ترويسة Authorization.

طرق المصادقة

الطريقةالترويسةحالة الاستخدام
رمز BearerAuthorization: Bearer <token>جلسات المستخدم، لوحة التحكم
مفتاح APIX-API-Key: <key>خادم إلى خادم، الأتمتة

التسجيل

POST https://api.mail.land/v1/auth/register
Registration request
{
  "email": "[email protected]",
  "password": "SecureP@ssw0rd!",
  "fullName": "John Doe",
  "companyName": "My Company"
}
Register
curl -X POST https://api.mail.land/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "SecureP@ssw0rd!",
    "fullName": "John Doe",
    "companyName": "My Company"
  }'
الحقلالنوعمطلوبالوصف
emailstringنعمعنوان البريد الإلكتروني
passwordstringنعمكلمة المرور (8-128 حرفًا؛ يجب أن تحتوي على حرف كبير وحرف صغير ورقم ورمز خاص)
fullNamestringلاالاسم الكامل
companyNamestringلااسم الشركة / مساحة العمل

الحقول غير المعروفة (مثل tenantName إذا أُرسل بالخطأ) يتم تجاهلها بصمت.

Registration response
{
  "requiresEmailVerification": true,
  "verificationTicket": "vt_abc123...",
  "maskedEmail": "u***@example.com"
}

رمز حالة الاستجابة هو 201.

بعد التسجيل، قم بالتحقق من عنوان البريد الإلكتروني قبل تسجيل الدخول.

التحقق من البريد الإلكتروني

يرسل التسجيل بريدًا إلكترونيًا يحتوي على رمز من 6 أرقام. استدعِ POST /v1/auth/verify-email-ticket مع { "ticket": "<verificationTicket>", "code": "123456" }؛ عند النجاح تُعاد استجابة رموز تسجيل الدخول.

POST https://api.mail.land/v1/auth/verify-email-ticket
Verify email request
{
  "ticket": "vt_abc123...",
  "code": "123456"
}
Verify email
curl -X POST https://api.mail.land/v1/auth/verify-email-ticket \
  -H "Content-Type: application/json" \
  -d '{"ticket": "vt_abc123...", "code": "123456"}'

إعادة إرسال بريد التحقق: استدعِ POST /v1/auth/resend-verification-ticket مع { "ticket": "..." }. هذا الطلب محكوم بحدّ معدل ويعيد بطاقة (ticket) جديدة.

POST https://api.mail.land/v1/auth/resend-verification-ticket
Resend verification request
{
  "ticket": "vt_abc123..."
}
Resend verification
curl -X POST https://api.mail.land/v1/auth/resend-verification-ticket \
  -H "Content-Type: application/json" \
  -d '{"ticket": "vt_abc123..."}'

تسجيل الدخول

POST https://api.mail.land/v1/auth/login
Login request
{
  "email": "[email protected]",
  "password": "SecureP@ssw0rd!"
}
Login
curl -X POST https://api.mail.land/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "SecureP@ssw0rd!"
  }'

الاستجابة

تختلف استجابة تسجيل الدخول بناءً على حالة الحساب:

تسجيل دخول ناجح:

Login response
{
  "userId": "v4j2x7n1m9k5p3",
  "email": "[email protected]",
  "fullName": "John Doe",
  "avatarUrl": null,
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "rt_a1b2c3d4e5...",
  "expiresAt": "2026-09-25T13:00:00Z",
  "requiresTwoFactor": false,
  "twoFactorChallengeId": null,
  "tenantCount": 1,
  "activeTenantId": "k3m9x2p7qw4rtz",
  "activeTenantName": "My Company",
  "requiresEmailVerification": false,
  "verificationTicket": null,
  "maskedEmail": null
}

لا يوجد كائن user ولا حقل role في الاستجابة. الحساب غير المُتحقَّق منه يحصل على 200 مع requiresEmailVerification: true وverificationTicket، وليس خطأً.

المصادقة الثنائية مطلوبة:

2FA required response
{
  "accessToken": null,
  "refreshToken": null,
  "requiresTwoFactor": true,
  "twoFactorChallengeId": "2fa_challenge_abc123"
}

عندما يكون requiresTwoFactor يساوي true، أكمل التحقق بخطوتين قبل استلام الرموز.

تحديث الرمز

تنتهي صلاحية رموز الوصول بعد 60 دقيقة. استخدم رمز التحديث للحصول على رمز وصول جديد:

POST https://api.mail.land/v1/auth/refresh-token
Refresh token request
{
  "refreshToken": "rt_a1b2c3d4e5..."
}
Refresh token
curl -X POST https://api.mail.land/v1/auth/refresh-token \
  -H "Content-Type: application/json" \
  -d '{"refreshToken": "rt_a1b2c3d4e5..."}'

الاستجابة لها نفس شكل استجابة تسجيل الدخول أعلاه (كائن AuthResponse الكامل)، وليس فقط هذه الحقول الثلاثة:

Refresh response
{
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "rt_new_token...",
  "expiresAt": "2026-09-25T14:00:00Z"
}

يمكن استخدام كل رمز تحديث مرة واحدة فقط. تتضمن الاستجابة رمز تحديث جديداً للدورة التالية.

تسجيل الخروج

إلغاء الجلسة الحالية:

POST https://api.mail.land/v1/auth/logout

أرسل { "refreshToken": "..." } في جسم الطلب (أو كوكي رمز التحديث). يتم إبطال رمز التحديث؛ ويظل رمز الوصول صالحًا حتى انتهاء صلاحيته: رأس Bearer وحده لا يُبطل شيئًا.

Logout
curl -X POST https://api.mail.land/v1/auth/logout \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

إلغاء جميع الجلسات النشطة:

POST https://api.mail.land/v1/auth/revoke-all-tokens
Revoke all sessions
curl -X POST https://api.mail.land/v1/auth/revoke-all-tokens \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

إدارة كلمة المرور

نسيت كلمة المرور

POST https://api.mail.land/v1/auth/forgot-password
Forgot password request
{
  "email": "[email protected]"
}
Forgot password
curl -X POST https://api.mail.land/v1/auth/forgot-password \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]"}'

يرسل بريداً إلكترونياً لإعادة تعيين كلمة المرور يحتوي على رمز محدود الصلاحية.

إعادة تعيين كلمة المرور

POST https://api.mail.land/v1/auth/reset-password

confirmPassword مطلوب ويجب أن يطابق newPassword؛ تنطبق نفس قواعد التعقيد المستخدمة عند التسجيل.

Reset password request
{
  "token": "reset-token-from-email",
  "newPassword": "NewSecureP@ssw0rd!",
  "confirmPassword": "NewSecureP@ssw0rd!"
}
Reset password
curl -X POST https://api.mail.land/v1/auth/reset-password \
  -H "Content-Type: application/json" \
  -d '{
    "token": "reset-token-from-email",
    "newPassword": "NewSecureP@ssw0rd!",
    "confirmPassword": "NewSecureP@ssw0rd!"
  }'

التحقق من صحة رمز الإعادة

تحقق مما إذا كان رمز الإعادة لا يزال صالحاً قبل عرض نموذج الإعادة:

GET https://api.mail.land/v1/auth/validate-reset-token?token=reset-token-from-email
التحقق من رمز إعادة التعيين
curl "https://api.mail.land/v1/auth/validate-reset-token?token=reset-token-from-email"
استجابة التحقق من الرمز
{
  "valid": true,
  "message": "Token is valid"
}

تغيير كلمة المرور

تغيير كلمة المرور للمستخدم المصادق عليه حالياً:

POST https://api.mail.land/v1/auth/change-password
Change password request
{
  "currentPassword": "OldP@ssw0rd!",
  "newPassword": "NewSecureP@ssw0rd!"
}
Change password
curl -X POST https://api.mail.land/v1/auth/change-password \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "currentPassword": "OldP@ssw0rd!",
    "newPassword": "NewSecureP@ssw0rd!"
  }'

إدارة الملف الشخصي

الحصول على المستخدم الحالي

GET https://api.mail.land/v1/auth/me
Get current user
curl https://api.mail.land/v1/auth/me \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Current user response
{
  "id": "v4j2x7n1m9k5p3",
  "email": "[email protected]",
  "fullName": "John Doe",
  "companyName": "Acme",
  "avatarUrl": "https://cdn.mail.land/avatars/usr_a1b2c3d4e5.jpg",
  "status": "Active",
  "createdAt": "2026-01-15T08:00:00Z",
  "subscription": {
    "planName": "Pro",
    "monthlyEmailLimit": 50000,
    "rateLimitPerSecond": 10,
    "startDate": "2026-01-15T08:00:00Z",
    "endDate": "2026-10-15T08:00:00Z",
    "status": "Active"
  },
  "stats": {
    "credentialCount": 3,
    "domainCount": 2
  }
}

لا يوجد حقل firstName أو lastName أو phone أو tenantId أو role أو twoFactorEnabled في هذه الاستجابة.

تحديث الملف الشخصي

PUT https://api.mail.land/v1/auth/profile

حقل fullName مطلوب؛ وعدم إرسال companyName يؤدي إلى مسحه. يطابق هذا التحديث صف المستخدم بمعرّف المستخدم وحده، لذا يعمل من أي مساحة عمل نشط فيها المستخدم، وليس فقط تلك التي أُنشئ فيها الحساب.

Update profile request
{
  "fullName": "Jane Smith",
  "companyName": "Acme"
}
Update profile
curl -X PUT https://api.mail.land/v1/auth/profile \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "fullName": "Jane Smith",
    "companyName": "Acme"
  }'

رفع الصورة الشخصية

POST https://api.mail.land/v1/account/avatar

أرسل طلب multipart/form-data مع ملف صورة الملف الشخصي. الصيغ المدعومة: JPEG وPNG وGIF وWebP (يتم فحص محتوى الملف وليس الامتداد فقط). الحجم الأقصى: 1 ميغابايت.

Upload avatar
curl -X POST https://api.mail.land/v1/account/avatar \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -F "file=@/path/to/avatar.jpg"

المصادقة الاجتماعية

تدعم MailLand تسجيل الدخول الاجتماعي عبر Google وGitHub وMicrosoft:

إعادة التوجيه إلى المزوّد

GET https://api.mail.land/auth/social/{provider}

حيث {provider} هو google أو github أو microsoft. يعيد هذا توجيه المستخدم إلى شاشة موافقة OAuth الخاصة بالمزوّد.

Redirect to social provider
curl https://api.mail.land/auth/social/google

معالجة الاستجابة

بعد موافقة المستخدم، يعيد المزوّد التوجيه إلى MailLand برمز تفويض:

GET https://api.mail.land/auth/social/{provider}/callback?code=...
Social callback
curl "https://api.mail.land/auth/social/google/callback?code=authorization-code-from-provider"

تتم معالجة الاستدعاء الراجع (callback) بواسطة MailLand، التي تعيد توجيه المتصفح إلى {frontend}/{locale}/auth/callback?code=<رمز لمرة واحدة>&provider=.... هذا الـ code هو رمز MailLand الخاص لمرة واحدة، وليس رمز التفويض الخاص بالمزوّد: مرره كما هو إلى خطوة التبادل أدناه.

تبادل الرموز

POST https://api.mail.land/v1/auth/social/exchange
Social exchange request
{
  "code": "one-time-code-from-callback-redirect"
}
Exchange social code for tokens
curl -X POST https://api.mail.land/v1/auth/social/exchange \
  -H "Content-Type: application/json" \
  -d '{"code": "one-time-code-from-callback-redirect"}'

يُرجع نفس AuthResponse الخاص بتسجيل الدخول العادي.

حذف الحساب

الحذف يتم على مستوى مساحة العمل، وليس على مستوى حساب المستخدم، ولا يمكن أن يبدأه سوى مالك (Owner) مساحة العمل. تتم جدولة الحذف بعد فترة سماح بدلاً من الحذف الفوري:

POST https://api.mail.land/v1/account/lifecycle/schedule-deletion
طلب جدولة الحذف
{
  "gracePeriodDays": 30
}
جدولة الحذف
curl -X POST https://api.mail.land/v1/account/lifecycle/schedule-deletion \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"gracePeriodDays": 30}'

يقبل gracePeriodDays قيمة بين 7 و90 (الافتراضي 30)؛ والقيم خارج هذا النطاق تُقيَّد إلى الحد الأقرب بدلاً من رفضها. يمكن إلغاء الحذف المجدول في أي وقت قبل انتهاء فترة السماح:

POST https://api.mail.land/v1/account/lifecycle/cancel-deletion

يقوم مالكو مساحة العمل بجدولة الحذف عبر POST /v1/account/lifecycle/schedule-deletion (بقيمة gracePeriodDays بين 7 و90، والافتراضي 30، مع تقييد القيم خارج النطاق بدلاً من رفضها) ويمكنهم إلغاءه عبر POST /v1/account/lifecycle/cancel-deletion قبل ذلك. لا توجد نقطة نهاية DELETE /v1/auth/delete-account، وهذا الإجراء ليس على مستوى المستخدم، بل يحذف مساحة العمل بأكملها بعد انتهاء فترة السماح.

استجابات الخطأ

الحالةالرمزالوصف
400VALIDATION_FAILEDفشل طلب التسجيل في التحقق من الصحة، مع مصفوفة errors[]
401UNAUTHORIZEDبريد إلكتروني أو كلمة مرور خاطئة
403FORBIDDENالحساب غير نشط
409CONFLICTالبريد الإلكتروني مسجّل بالفعل
429TOO_MANY_LOGIN_ATTEMPTSمحاولات دخول فاشلة كثيرة جداً؛ تتضمن الاستجابة رأس Retry-After

البريد الإلكتروني غير المتحقَّق منه لا يُعيد خطأً: يستجيب تسجيل الدخول بـ 200 مع requiresEmailVerification: true وبطاقة (verificationTicket) جديدة.

الخطوات التالية

في هذه الصفحة