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/ServiceProviderConfig | SCIM 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
- انتقل إلى الإعدادات > Provisioning > SCIM > Tokens.
- انقر إنشاء Token.
- انسخ الـ 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 | ملاحظات |
|---|---|---|
userName | email | يجب يكون بريد إلكتروني صالح |
name.givenName | firstName | |
name.familyName | lastName | |
name.formatted | الاسم البديل | يُستخدم عند غياب الاسم الأول واسم العائلة |
emails[primary=true].value | email | مفضّل على userName |
active | status | false = موقوف، true = نشط |
phoneNumbers[primary=true].value | phone | |
locale | locale | BCP 47 language tag |
externalId | externalId | معرّف المستخدم في الـ 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 |
|---|---|
displayName | name |
externalId | externalId |
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 URL | https://api.ithbat.io/scim/v2 |
| Unique identifier field | userName |
| Authentication mode | HTTP Header |
| Authorization | Bearer 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 Mode | Automatic |
| Tenant URL | https://api.ithbat.io/scim/v2 |
| Secret Token | scim_live_abc123... |
انقر Test Connection للتحقق، ثم Save.
الخطوة 3 -- Attribute Mapping
انتقل إلى Mappings وافتح Provision Azure Active Directory Users. تأكد من الـ Mappings التالية:
| Azure AD Attribute | SCIM Attribute |
|---|---|
userPrincipalName | userName |
givenName | name.givenName |
surname | name.familyName |
mail | emails[type eq "work"].value |
accountEnabled | active |
objectId | externalId |
الخطوة 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}
الخطوات التالية
- SAML 2.0 SSO -- اقران SAML SSO بـ SCIM لدورة حياة متكاملة
- مزامنة الدليل -- مسار بديل لبيئات LDAP/AD
- إدارة المستخدمين -- إدارة المستخدمين المُنشأين عبر SCIM