انتقل إلى المحتوى الرئيسي

SCIM 2.0 Provisioning

SCIM 2.0 (RFC 7643/7644) معيار API مفتوح يمكّن الـ IdP من إنشاء وتحديث وإلغاء Provisioning للمستخدمين تلقائيًا في Ithbat IAM. بدلاً من إدارة الحسابات في نظامين، تنتقل التغييرات في الـ IdP (Okta، Azure AD، وغيرها) إلى Ithbat تلقائيًا -- عادةً خلال ثوانٍ.

بدون SCIM، حساب المستخدم يبقى في Ithbat حتى بعد مغادرته المؤسسة. مع SCIM، الـ Deprovisioning يحصل تلقائيًا عندما الـ IdP يعلّم المستخدم كغير نشط أو يحذفه.


SCIM Base URL

https://api.ithbat.io/scim/v2

جميع الـ SCIM Endpoints نسبية لهذا الـ Base URL. الـ Discovery Endpoints متاحة بدون مصادقة:

Endpointالوصف
GET /scim/v2/ServiceProviderConfigSCIM capabilities في Ithbat
GET /scim/v2/ResourceTypesالـ Resource types المدعومة (User, Group)
GET /scim/v2/Schemasالـ Attribute schemas الكاملة

تفعيل SCIM للمستفيد

الخطوة 1 -- تفعيل SCIM

SCIM متاح في خطتي Growth و Enterprise. في لوحة تحكم المسؤول، انتقل إلى الإعدادات > Provisioning > SCIM وفعّل SCIM.

الخطوة 2 -- إنشاء Bearer Token

  1. انتقل إلى الإعدادات > Provisioning > SCIM > Tokens.
  2. انقر إنشاء Token.
  3. انسخ الـ Token فورًا -- يظهر مرة واحدة فقط.

يمكنك تنشئ عدة Tokens (مثلًا Token لكل تكامل) وتبطل كل واحد منها على حدة.

POST /api/v1/scim/tokens
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

Response:

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"token": "scim_live_abc123...",
"createdAt": "2026-02-24T10:00:00Z"
}

الخطوة 3 -- إعداد الـ IdP

زوّد الـ IdP بالتالي:

  • SCIM Base URL: https://api.ithbat.io/scim/v2
  • Bearer Token: الـ Token الذي أنشأته في الخطوة السابقة

المصادقة

كل SCIM Request يجب يتضمن Bearer Token في الـ Authorization Header:

Authorization: Bearer scim_live_abc123...

الـ SCIM Tokens منفصلة عن الـ Access Tokens العادية ولا تنتهي صلاحيتها افتراضيًا. أبطلها من لوحة تحكم المسؤول أو عبر API إذا تم اختراقها.


الموارد المدعومة

المستخدمون

دعم كامل لدورة الحياة: إنشاء، قراءة، تحديث، PATCH، حذف، وسرد مع تصفية.

Endpoint: /scim/v2/Users

Attribute Mapping: SCIM ← Ithbat

SCIM Attributeحقل Ithbatملاحظات
userNameemailيجب يكون بريد إلكتروني صالح
name.givenNamefirstName
name.familyNamelastName
name.formattedالاسم البديليُستخدم عند غياب الاسم الأول واسم العائلة
emails[primary=true].valueemailمفضّل على userName
activestatusfalse = موقوف، true = نشط
phoneNumbers[primary=true].valuephone
localelocaleBCP 47 language tag
externalIdexternalIdمعرّف المستخدم في الـ IdP

مثال: Create User Request

POST /scim/v2/Users
Authorization: Bearer scim_live_abc123...
Content-Type: application/scim+json

{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "[email protected]",
"name": {
"givenName": "Jane",
"familyName": "Doe"
},
"emails": [
{
"value": "[email protected]",
"primary": true
}
],
"active": true,
"externalId": "00u1abc2defGHIJK"
}

مثال: Create User Response

HTTP/1.1 201 Created
Content-Type: application/scim+json

{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"externalId": "00u1abc2defGHIJK",
"userName": "[email protected]",
"name": {
"givenName": "Jane",
"familyName": "Doe",
"formatted": "Jane Doe"
},
"emails": [
{
"value": "[email protected]",
"primary": true
}
],
"active": true,
"meta": {
"resourceType": "User",
"created": "2026-02-24T10:00:00Z",
"lastModified": "2026-02-24T10:00:00Z",
"location": "https://api.ithbat.io/scim/v2/Users/3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
}

مثال: Deactivate User (PATCH)

PATCH /scim/v2/Users/{id}
Authorization: Bearer scim_live_abc123...
Content-Type: application/scim+json

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "active",
"value": false
}
]
}

تعيين active لـ false يوقف الحساب. جميع الـ Sessions النشطة تُبطل فورًا.


المجموعات

دعم كامل لدورة الحياة: إنشاء، قراءة، تحديث، PATCH، حذف، وسرد مع تصفية.

Endpoint: /scim/v2/Groups

Attribute Mapping: SCIM ← Ithbat

SCIM Attributeحقل Ithbat
displayNamename
externalIdexternalId
members[].valueمعرّفات أعضاء المجموعة

مثال: Create Group

POST /scim/v2/Groups
Authorization: Bearer scim_live_abc123...
Content-Type: application/scim+json

{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "Engineering",
"externalId": "00g1abc2defGHIJK",
"members": [
{
"value": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"display": "[email protected]"
}
]
}

مثال: تعديل أعضاء المجموعة (PATCH)

PATCH /scim/v2/Groups/{id}
Authorization: Bearer scim_live_abc123...
Content-Type: application/scim+json

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [
{
"value": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
]
}
]
}

Listing والتصفية

Ithbat يدعم SCIM Filter Syntax عبر الـ filter Query Parameter.

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

GET /scim/v2/Users?startIndex=1&count=100

التصفية بـ userName

GET /scim/v2/Users?filter=userName eq "[email protected]"

التصفية بـ externalId

GET /scim/v2/Users?filter=externalId eq "00u1abc2defGHIJK"

Pagination

GET /scim/v2/Users?startIndex=101&count=100

الـ Response يتضمن totalResults وstartIndex وitemsPerPage حسب مواصفات SCIM.


أدلة إعداد الـ IdP

Okta SCIM

المتطلبات المسبقة

تطبيق Okta يجب يدعم SCIM Provisioning. استخدم قالب SCIM 2.0 أو تطبيق مخصص مع تفعيل SCIM.

الخطوة 1 -- إضافة Provisioning

في Okta، افتح تطبيقك وانتقل إلى تبويب Provisioning. انقر Configure API Integration وفعّله.

الخطوة 2 -- إعداد SCIM Connection

الحقلالقيمة
SCIM connector base URLhttps://api.ithbat.io/scim/v2
Unique identifier fielduserName
Authentication modeHTTP Header
AuthorizationBearer scim_live_abc123...

انقر Test API Credentials للتحقق، ثم Save.

الخطوة 3 -- تفعيل Provisioning Actions

ضمن To App، فعّل:

  • Create Users
  • Update User Attributes
  • Deactivate Users

ضمن To Okta، فعّل:

  • Sync Password (اختياري)

الخطوة 4 -- Attribute Mapping

انتقل إلى Provisioning > Attribute Mappings وتأكد أن userName يشير لـ login (البريد الإلكتروني) في Okta.

الخطوة 5 -- Assign Users

انتقل إلى Assignments وعيّن المستخدمين أو المجموعات. كل assignment يُطلق SCIM Create/Update.


Azure AD (Entra ID) SCIM

الخطوة 1 -- Enterprise Application

في Azure Portal، انتقل إلى Entra ID > Enterprise applications، افتح تطبيقك، واختر Provisioning.

الخطوة 2 -- إعداد الاتصال

الحقلالقيمة
Provisioning ModeAutomatic
Tenant URLhttps://api.ithbat.io/scim/v2
Secret Tokenscim_live_abc123...

انقر Test Connection للتحقق، ثم Save.

الخطوة 3 -- Attribute Mapping

انتقل إلى Mappings وافتح Provision Azure Active Directory Users. تأكد من الـ Mappings التالية:

Azure AD AttributeSCIM Attribute
userPrincipalNameuserName
givenNamename.givenName
surnamename.familyName
mailemails[type eq "work"].value
accountEnabledactive
objectIdexternalId

الخطوة 4 -- Scope

ضمن Settings > Scope، اختر Sync only assigned users and groups ثم عيّن المستخدمين والمجموعات في تبويب Users and groups.

الخطوة 5 -- بدء Provisioning

انقر Start provisioning. Azure يجري initial Sync خلال ~40 دقيقة. تابع من تبويب Provisioning logs.


معالجة الأخطاء

عرض SCIM Logs

GET /api/v1/scim/logs
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

كل إدخال يسجّل الـ Request method ونوع المورد والـ Status Code ورسالة الخطأ.

الأخطاء الشائعة

Status Codeالمعنىالحل
401 Unauthorizedالـ SCIM Token غير صالح أو مُبطَلأنشئ Token جديد وحدّثه في الـ IdP
404 Not Found (عند التحديث)المستخدم غير موجود بهذا المعرّفالـ IdP لديه معرّف قديم؛ شغّل full re-sync
409 Conflictالبريد الإلكتروني موجود مسبقًامستخدم بهذا البريد أُنشئ خارج SCIM؛ الـ IdP يجب يرسل PATCH بدل POST
400 Bad Requestحقل مطلوب مفقودتأكد أن userName معيّن ويتضمن بريد إلكتروني صالح
422 Unprocessable Entityبلغ حد المستخدمينرقّي الخطة أو أزل المستخدمين غير النشطين

فرض Re-sync

إذا Okta أو Azure AD فقدوا الـ Sync مع Ithbat:

  • Okta: انتقل إلى Provisioning > Import، انقر Import Now > Full Import.
  • Azure AD: في إعدادات Provisioning، انقر Restart provisioning.

SCIM Config API

جلب SCIM Config

GET /api/v1/scim/config
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

تحديث SCIM Config

PUT /api/v1/scim/config
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}
Content-Type: application/json

{
"enabled": true
}

سرد SCIM Tokens

GET /api/v1/scim/tokens
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

إنشاء SCIM Token

POST /api/v1/scim/tokens
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

إبطال SCIM Token

POST /api/v1/scim/tokens/{id}/revoke
Authorization: Bearer {admin_token}
X-Tenant-ID: {tenant_id}

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