Maham Auth Service

API Documentation

v1.0.0
Health

خدمة المصادقة المركزية

مصادقة JWT، نظام صلاحيات RBAC، وتواصل بين الخدمات

مصادقة JWT

توكنات آمنة مع تجديد وحظر

صلاحيات RBAC

أدوار وصلاحيات مع تسلسل هرمي

متعدد اللغات

عربي وإنجليزي عبر Accept-Language

Base URL

http://auth-service-api.mahamexpo.sa/api
Health CheckGET /health
{
  "status": "ok",
  "service": "auth-service",
  "version": "1.0.0",
  "timestamp": "2026-05-27T17:45:38.485225Z"
}

البدء السريع

اتبع هذه الخطوات للبدء باستخدام API

1

سجل حساب جديد

curl -X POST http://auth-service-api.mahamexpo.sa/api/auth/register \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"name":"Ahmed","email":"ahmed@example.com","password":"Password123","password_confirmation":"Password123"}'
2

سجل الدخول واحصل على التوكن

curl -X POST http://auth-service-api.mahamexpo.sa/api/auth/login \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"identifier":"ahmed@example.com","password":"Password123"}'
3

استخدم التوكن للطلبات المحمية

curl -X GET http://auth-service-api.mahamexpo.sa/api/auth/me \
  -H "Accept: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"

الهيدرات المطلوبة

الهيدر القيمة مطلوب الوصف
Content-Typeapplication/jsonنوع المحتوى المرسل
Acceptapplication/jsonنوع المحتوى المطلوب
AuthorizationBearer {token}للمحميةتوكن JWT للمحمية
Accept-Languagear | enاختياريلغة الردود

المصادقة

تستخدم الـ API مصادقة JWT.

طلبات المستخدم (JWT)

Authorization: Bearer eyJ0eXAiOiJKV1Qi...

تواصل بين الخدمات

Internal Docker Network (no auth needed)

معلومات التوكن

مدة الصلاحية: 480 دقيقة
فترة التجديد: 480 دقيقة
الخوارزمية: HS256

تنبيهات مهمة

  • • عند تسجيل الخروج يتم حظر التوكن
  • • استخدم /auth/refresh لتجديد التوكن
  • • التوكن القديم يصبح غير صالح بعد التجديد

صيغة الردود

رد ناجح2xx
{
  "success": true,
  "message": "Operation successful",
  "data": { ... }
}
رد خطأ4xx/5xx
{
  "success": false,
  "message": "Error message",
  "code": "error_code",
  "errors": { ... }
}
الحقل النوع الوصف
successbooleanحالة العملية
messagestringرسالة توضيحية
dataobject|arrayالبيانات
codestringرمز الخطأ
errorsobjectأخطاء التحقق
POST /auth/register تسجيل مستخدم جديد عام
الحقلالنوعمطلوبالقواعد
namestringmax:255
emailstringبريد صالح، فريد
passwordstring8 أحرف+، كبير وصغير وأرقام
password_confirmationstringيطابق كلمة المرور
phonestringmax:20
Request
{
  "name": "Ahmed",
  "email": "ahmed@example.com",
  "password": "Password123",
  "password_confirmation": "Password123",
  "phone": "0501234567"
}
Response201
{
  "success": true,
  "message": "Registration successful",
  "data": {
    "user": { ... },
    "token": "eyJ0eXAi..."
  }
}
POST /auth/login تسجيل الدخول عام
الحقلالنوعمطلوبالقواعد
identifierstringالبريد أو رقم الجوال
passwordstringكلمة المرور
Request
{
  "identifier": "ahmed@example.com",
  "password": "Password123"
}
Response200
{
  "success": true,
  "message": "Login successful",
  "data": {
    "user": { ... },
    "token": "eyJ0eXAi...",
    "token_type": "bearer",
    "expires_in": 3600
  }
}

📱 تسجيل الدخول عبر OTP

تسجيل الدخول أو إنشاء حساب جديد عبر رقم الجوال و رمز التحقق — مزود Authentica

التدفق الكامل:

  1. أرسل رقم الجوال → يصلك رمز OTP (user_type اختياري)
  2. أرسل الرمز للتحقق → موجود = توكن، جديد = registration_token
  3. (مستخدمين جدد) أكمل البيانات + حدد نوع الحساب user_type
🔌 المزود: Authentica — SMS + WhatsApp مع فولباك
⚠️ وضع الاختبار: أي رمز OTP مقبول (لا يُرسل SMS فعلي)
POST /auth/otp/send إرسال رمز التحقق عام
الحقلالنوعمطلوبالقواعد
phonestringرقم الجوال
user_typestringاختياري — يُكتشف تلقائياً
channelstringsms | whatsapp
Request
{
  "phone": "+966567891234"
}
Response200
{
  "success": true,
  "message": "تم إرسال رمز التحقق",
  "data": {
    "is_new_user": false,
    "user_type": "merchant"
  }
}

أمثلة الأخطاء المحتملة

تجاوز حد الإرسال429
{
  "success": false,
  "message": "تم تجاوز الحد الأقصى لمحاولات الإرسال",
  "error_code": "otp_max_attempts_exceeded"
}
فشل الإرسال422
{
  "success": false,
  "message": "فشل إرسال رمز التحقق",
  "error_code": "otp_send_failed"
}
بيانات غير صحيحة400
{
  "success": false,
  "message": "فشل التحقق من البيانات",
  "error_code": "validation_failed",
  "errors": {
    "phone": ["حقل الهاتف مطلوب"]
  }
}
الحساب محظور403
{
  "success": false,
  "message": "حسابك محظور. تواصل مع الدعم",
  "error_code": "user_blocked"
}
POST /auth/otp/verify تحقق من الرمز عام
الحقلالنوعمطلوبالقواعد
phonestringنفس رقم الإرسال
codestringرمز التحقق
user_typestringاختياري — يُكتشف تلقائياً

إذا كان المستخدم موجود → يرجع token. إذا جديد → يرجع registration_token.

Request
{
  "phone": "+966567891234",
  "code": "123456"
}
رد — مستخدم موجود200
{
  "success": true,
  "message": "تم تسجيل الدخول بنجاح",
  "data": {
    "is_new_user": false,
    "user": { ... },
    "token": "eyJ0eXAi...",
    "token_type": "bearer",
    "expires_in": 3600
  }
}
رد — مستخدم جديد200
{
  "success": true,
  "message": "تم التحقق — أكمل بياناتك للتسجيل",
  "data": {
    "is_new_user": true,
    "registration_token": "xPbaVXHRV5zXi4bBJx92Q..."
  }
}

أمثلة الأخطاء المحتملة

رمز خاطئ401
{
  "success": false,
  "message": "رمز التحقق غير صحيح",
  "error_code": "otp_invalid"
}
رمز منتهي401
{
  "success": false,
  "message": "رمز التحقق منتهي الصلاحية",
  "error_code": "otp_expired"
}
POST /auth/otp/complete-registration إكمال التسجيل بعد OTP عام

فقط للمستخدمين الجدد بعد الحصول على registration_token — يجب تحديد نوع الحساب

الحقلالنوعمطلوبالقواعد
registration_tokenstringالتوكن من verify
namestringالاسم الكامل
user_typestringmerchant | investor | sponsor | user
emailstringبريد إلكتروني
business_namestringاسم المؤسسة
business_typestringنوع النشاط
regionstringالمنطقة
Request
{
  "registration_token": "xPbaVXHRV5zXi4bBJx92Q...",
  "name": "أحمد محمد",
  "user_type": "merchant",
  "email": "ahmed@example.com",
  "business_name": "مؤسسة النجاح التجارية"
}
Response201
{
  "success": true,
  "message": "تم التسجيل بنجاح",
  "data": {
    "user": { ... },
    "token": "eyJ0eXAi...",
    "token_type": "bearer",
    "expires_in": 3600
  }
}

أمثلة الأخطاء المحتملة

توكن غير صالح401
{
  "success": false,
  "message": "رمز التسجيل غير صالح أو منتهي",
  "error_code": "otp_expired"
}
بريد مكرر400
{
  "success": false,
  "error_code": "validation_failed",
  "errors": {
    "email": ["البريد مستخدم"]
  }
}
نوع ممنوع400
{
  "success": false,
  "error_code": "validation_failed",
  "errors": {
    "user_type": ["القيمة المختارة غير صالحة"]
  }
}

📱 إدارة OTP

إدارة المزودين والرصيد والإحصائيات — يحتاج أدمن

GET /admin/otp/balance رصيد المزود النشط Admin

يرجع رصيد مزود OTP النشط حالياً

Response200
{
  "success": true,
  "data": {
    "provider": "authentica",
    "balance": "100.00"
  }
}
GET /admin/otp/providers حالة المزودين Admin

يرجع حالة كل المزودين

Response200
{
  "success": true,
  "data": {
    "active_provider": "authentica",
    "test_mode": true,
    "providers": {
      "authentica": { "configured": true, "active": true },
      "twilio": { "configured": false, "active": false }
    }
  }
}
GET /admin/otp/stats إحصائيات OTP Admin

إحصائيات OTP اليوم والأسبوع والشهر

Response200
{
  "success": true,
  "data": {
    "today": { "otp_sent": 15, "otp_logins": 8, "otp_registrations": 3 },
    "this_week": { ... },
    "this_month": { ... },
    "active_provider": "authentica",
    "balance": { "balance": "99.00" }
  }
}
POST /auth/logout تسجيل الخروج Auth

لا يحتاج حقول. يتم حظر التوكن الحالي.

Response200
{
  "success": true,
  "message": "Logout successful"
}
GET /auth/me بيانات المستخدم الحالي Auth

لا يحتاج حقول.

Response200
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-...",
    "name": "Ahmed",
    "email": "ahmed@example.com",
    "phone": "0501234567",
    "status": "active",
    "roles": ["user"],
    "permissions": ["users.view"]
  }
}
POST /auth/refresh تجديد التوكن Auth

لا يحتاج حقول.

Response200
{
  "success": true,
  "data": {
    "token": "eyJ0eXAi...",
    "token_type": "bearer",
    "expires_in": 28800
  }
}
POST /auth/forgot-password طلب إعادة تعيين عام
الحقلالنوعمطلوبالقواعد
emailstringبريد صالح، مسجل
ملاحظة: التوكن يُرجع فقط في بيئة التطوير
POST /auth/reset-password إعادة تعيين كلمة المرور عام
الحقلالنوعمطلوبالقواعد
emailstringبريد صالح
tokenstringرمز إعادة التعيين
passwordstring8 أحرف+
password_confirmationstringيطابق كلمة المرور
POST /auth/change-password تغيير كلمة المرور Auth
الحقلالنوعمطلوبالقواعد
current_passwordstringكلمة المرور الحالية
passwordstring8+، مختلفة عن الحالية
password_confirmationstringيطابق كلمة المرور
PUT /auth/profile تحديث الملف الشخصي Auth
الحقلالنوعمطلوبالقواعد
namestringmax:255
emailstringبريد صالح، فريد
phonestringmax:20
تنبيه: عند تغيير البريد سيتم إلغاء التحقق
POST /auth/email/send-verification إرسال كود التحقق Auth

لا يحتاج حقول.

ملاحظة: الكود يُرجع فقط في بيئة التطوير. صالح 15 دقيقة.
POST /auth/email/verify التحقق من البريد Auth
الحقلالنوعمطلوبالقواعد
codestring6 أرقام
POST /auth/phone/send-otp إرسال رمز تحقق الجوال Auth

يرسل رمز OTP لتوثيق رقم جوال المستخدم المسجل دخوله.

الحقلالنوعمطلوبالقواعد
phonestringرقم الجوال
channelstringsms | whatsapp
Request
{
  "phone": "0501234567",
  "channel": "sms"
}
Response200
{
  "success": true,
  "message": "تم إرسال رمز التحقق",
  "data": {
    "channel": "sms"
  }
}
POST /auth/phone/verify-otp تأكيد رقم الجوال Auth
الحقلالنوعمطلوبالقواعد
phonestringنفس الرقم
codestringرمز التحقق
Request
{
  "phone": "0501234567",
  "code": "123456"
}
Response200
{
  "success": true,
  "message": "تم توثيق رقم الجوال بنجاح"
}
POST /verify-token التحقق من صلاحية التوكن Auth
الحقلالنوعمطلوبالقواعد
tokenstringتوكن JWT المراد فحصه
Request
{
  "token": "eyJ0eXAi..."
}
Response200
{
  "success": true,
  "data": {
    "valid": true,
    "user": { ... },
    "expires_at": "..."
  }
}
POST /check-permission فحص صلاحية واحدة Auth
الحقلالنوعمطلوبالقواعد
user_idstring (UUID)UUID المستخدم
permissionstringمثل: users.view
Request
{
  "user_id": "uuid-here",
  "permission": "users.view"
}
Response200
{
  "success": true,
  "data": {
    "has_permission": true,
    "user_id": "uuid",
    "permission": "users.view"
  }
}
POST /check-permissions فحص عدة صلاحيات Auth
الحقلالنوعمطلوبالقواعد
user_idstring (UUID)UUID المستخدم
permissionsarrayمصفوفة الصلاحيات
require_allbooleanالافتراضي: false
Request
{
  "user_id": "uuid-here",
  "permissions": [
    "users.view",
    "users.create"
  ],
  "require_all": false
}
Response200
{
  "success": true,
  "data": {
    "has_access": true,
    "permissions": {
      "users.view": true,
      "users.create": false
    },
    "require_all": false
  }
}

إدارة المستخدمين

CRUD كامل - تتطلب صلاحيات users.*

الطريقةالمسارالوصفالصلاحية
GET/usersقائمة المستخدمينusers.view
POST/usersإنشاء مستخدمusers.create
GET/users/{id}عرض مستخدمusers.view
PUT/users/{id}تحديث مستخدمusers.update
DEL/users/{id}حذف مستخدمusers.delete

حقول إنشاء / تحديث المستخدم

الحقلالنوعإنشاءتحديثالقواعد
namestringmax:255
emailstringبريد صالح، فريد
passwordstring8 أحرف+
password_confirmationstringيطابق كلمة المرور
phonestringmax:20
statusstringactive | suspended | blocked
rolesarrayمصفوفة أسماء الأدوار

إدارة الأدوار

MethodEndpointالوصفPermission
GET/rolesقائمة الأدوارroles.view
POST/rolesإنشاء دورroles.create
GET/roles/{id}عرض دورroles.view
PUT/roles/{id}تحديث دورroles.update
DEL/roles/{id}حذف دورroles.delete
POST/roles/{id}/permissionsمزامنة الصلاحياتroles.update
POST/roles/{id}/permissions/addإضافة صلاحياتroles.update
POST/roles/{id}/permissions/removeإزالة صلاحياتroles.update

حقول إنشاء/تحديث الدور

FieldTypeCreateUpdateRules
namestringفريد، max:255
display_namestringmax:255
descriptionstringmax:500

حقول مزامنة / إضافة / إزالة الصلاحيات

FieldTypeRequiredRules
permissionsarray["users.view", "users.create"]

إدارة الصلاحيات

MethodEndpointالوصفPermission
GET/permissionsقائمة الصلاحياتpermissions.view
POST/permissionsإنشاء صلاحيةpermissions.create
POST/permissions/resourceإنشاء مجموعة لموردpermissions.create
GET/permissions/{id}عرض صلاحيةpermissions.view
PUT/permissions/{id}تحديث صلاحيةpermissions.update
DEL/permissions/{id}حذف صلاحيةpermissions.delete

POST /permissions

FieldTypeRequiredRules
namestringفريد، مثل: reports.export
display_namestringmax:255
descriptionstringmax:500

POST /permissions/resource

FieldTypeRequiredRules
resourcestringاسم المورد
actionsarrayالافتراضي: [view,create,update,delete]

إدارة الخدمات

MethodEndpointالوصفPermission
GET/servicesقائمة الخدماتservices.view
POST/servicesإنشاء خدمةservices.create
GET/services/{id}عرض خدمةservices.view
PUT/services/{id}تحديث خدمةservices.update
DEL/services/{id}حذف خدمةservices.delete
POST/services/{id}/regenerate-tokenإعادة توليد التوكنservices.update

حقول إنشاء/تحديث الخدمة

FieldTypeCreateUpdateRules
namestringفريد، max:255
base_urlstringURL صالح
descriptionstringmax:500
is_activebooleanالافتراضي: true

تواصل بين الخدمات (S2S)

محمية عبر الشبكة الداخلية فقط

No authentication required — internal Docker network
MethodEndpointالوصف
POST/service/verify-tokenالتحقق من توكن مستخدم
POST/service/check-permissionفحص صلاحية مستخدم
POST/service/user-infoجلب بيانات مستخدم

حقول S2S

EndpointFieldTypeRequiredالوصف
/service/verify-tokentokenstringتوكن JWT
/service/check-permissionuser_idstringUUID
permissionstringاسم الصلاحية
/service/user-infouser_idstringUUID

رموز الحالة HTTP

الرمزNameالوصف
نجاح
200OKتمت العملية بنجاح
201Createdتم إنشاء المورد
أخطاء العميل
400Bad Requestخطأ في التحقق
401Unauthorizedغير مصرح
403Forbiddenليس لديك صلاحية
404Not Foundغير موجود
422Unprocessableلا يمكن معالجتها
429Too Manyتجاوز حد الطلبات
أخطاء الخادم
500Server Errorخطأ في الخادم

جدول رموز الأخطاء

شكل رد الخطأ

رد خطأ عام4xx/5xx
{
  "success": false,
  "message": "رسالة الخطأ بالعربي",
  "error_code": "error_code_string"
}
رد خطأ التحقق400
{
  "success": false,
  "message": "فشل التحقق من البيانات",
  "error_code": "validation_failed",
  "errors": {
    "phone": ["حقل الهاتف مطلوب"],
    "code": ["الرمز يجب أن يكون 4 أحرف على الأقل"]
  }
}

ملاحظة: حقل errors يظهر فقط في أخطاء التحقق

Error CodeHTTPالوصف
🔐 OTP / SMS / WhatsApp
otp_send_failed422فشل إرسال رمز التحقق
otp_invalid401رمز التحقق غير صحيح
otp_expired401رمز التحقق منتهي الصلاحية
otp_max_attempts_exceeded429تجاوزت الحد الأقصى للمحاولات
otp_already_sent429تم إرسال رمز مسبقاً
phone_verification_required403يجب التحقق من الجوال أولاً
phone_already_verified409الجوال محقق مسبقاً
email_verification_required403يجب التحقق من البريد
email_already_verified409البريد محقق مسبقاً
🔑 Authentication
authentication_required401يجب تسجيل الدخول
invalid_login_credentials401بيانات الدخول غير صحيحة
token_expired401انتهت صلاحية التوكن
token_invalid401التوكن غير صالح
token_blacklisted401التوكن محظور
token_not_provided401لم يتم إرسال التوكن
too_many_login_attempts429محاولات دخول كثيرة
account_locked403الحساب مقفل
🛡️ Authorization / Account
permission_denied403ليس لديك صلاحية
insufficient_permissions403صلاحيات غير كافية
user_blocked403الحساب محظور
user_suspended403الحساب معلّق
user_disabled403الحساب معطّل
user_not_verified403الحساب غير موثق
user_deleted404الحساب محذوف
⚠️ Validation
validation_failed400فشل التحقق من البيانات
invalid_phone_format400صيغة الجوال غير صحيحة
invalid_email_format400صيغة البريد غير صحيحة
missing_required_field400حقل مطلوب مفقود
invalid_input400إدخال غير صالح
📦 Resources
resource_not_found404المورد غير موجود
resource_already_exists409المورد موجود مسبقاً
user_not_found404المستخدم غير موجود
user_already_exists409المستخدم موجود مسبقاً
user_email_already_exists409البريد مستخدم
user_phone_already_exists409الجوال مسجل مسبقاً
role_not_found404الدور غير موجود
🔒 Password
password_reset_token_invalid401رمز إعادة التعيين غير صالح
password_reset_token_expired401رمز إعادة التعيين منتهي
password_same_as_old400كلمة المرور مطابقة للقديمة
password_mismatch400كلمة المرور غير متطابقة
⏱️ Rate Limiting
rate_limit_exceeded429تجاوزت حد الطلبات
rate_limit_login_exceeded429محاولات دخول كثيرة
🖥️ Server / Service
internal_server_error500خطأ داخلي في السيرفر
service_unavailable503الخدمة غير متوفرة
service_communication_failed502فشل الاتصال بالخدمة
maintenance_mode503وضع الصيانة

💡 الأكواد أعلاه هي الأكثر استخداماً. يوجد 120+ كود خطأ.

حد الطلبات

النوعالحدالفترة
API Requestsفي الدقيقة
Login Attempts10في الدقيقة
Service-to-Service100في الدقيقة

الأدوار والصلاحيات الافتراضية

super-admin

وصول كامل

admin

إدارة كاملة

supervisor

مراقبة وموافقات

investor

إدارة المساحات

merchant

طلبات إيجار وزيارة

sponsor

إدارة الرعاية

user

مستخدم عادي

الموردالصلاحيات
Usersusers.view users.create users.update users.delete
Rolesroles.view roles.create roles.update roles.delete
Permissionspermissions.view permissions.create permissions.update permissions.delete
Servicesservices.view services.create services.update services.delete