Authagonal

التوثيق

كل ما تحتاجه للبدء مع Authagonal — من إنشاء أول مستأجر لك إلى ربط SSO وSCIM والعلامة التجارية المخصصة.

البدء

يمنح Authagonal كل مستأجر خادم OIDC متوافقًا تمامًا مع المعايير. يحصل كل مستأجر على عنوان URL خاص بالمُصدِر، ووثيقة اكتشاف، ونقاط نهاية للرموز، دون أي بنية تحتية مشتركة بين المستأجرين. يمكنك الانتقال من الصفر إلى تدفق تسجيل دخول يعمل بالكامل في أقل من 5 دقائق.

إنشاء حساب

سجّل في authagonal.io واختر معرّفًا (slug) لحسابك. يصبح هذا المعرّف نطاق المُصدِر الخاص بك: {slug}.authagonal.io. بعد إنشاء حسابك، تحقق من عنوان بريدك الإلكتروني للبدء.

Authagonal signup page showing tenant slug input and email verification

اختر معرّفًا فريدًا لحسابك أثناء التسجيل

تسجيل عميل

انتقل إلى العملاء في الشريط الجانبي للبوابة وانقر على إنشاء. أدخل clientId وclientName لتطبيقك. ثم اضبط عنوان إعادة توجيه واحدًا على الأقل، وهو المكان الذي يُرسَل إليه المستخدمون بعد المصادقة. على سبيل المثال: https://app.example.com/callback.

Client creation form with clientId, clientName, and redirect URI fields

سجّل عميل OAuth جديدًا في البوابة

التطوير المحلي

استخدم http://localhost:3000/callback كعنوان إعادة توجيه للتطوير المحلي. يسمح Authagonal بعناوين إعادة توجيه غير مشفّرة بـ HTTPS لمصادر localhost.

أول تسجيل دخول لك

أسرع طريقة للتكامل هي عبر oidc-client-ts، وهي مكتبة عميل OIDC خفيفة لتطبيقات JavaScript وTypeScript.

oidc-client-ts integration
import { UserManager } from 'oidc-client-ts';

const mgr = new UserManager({
  authority: 'https://acme.authagonal.io',
  client_id: 'my-app',
  redirect_uri: 'https://app.example.com/callback',
  response_type: 'code',
  scope: 'openid profile email',
});

// Redirect to login
mgr.signinRedirect();

// On callback page
const user = await mgr.signinRedirectCallback();
console.log(user.profile); // { sub, email, name, ... }

إذا كنت تفضّل نهجًا بسيطًا دون مكتبة، يمكنك استخدام تدفق رمز التفويض القياسي في OAuth 2.0 مع fetch البسيط:

Minimal fetch-based flow
// 1. Redirect the user to the authorization endpoint
const authorizeUrl = new URL('https://acme.authagonal.io/connect/authorize');
authorizeUrl.searchParams.set('client_id', 'my-app');
authorizeUrl.searchParams.set('redirect_uri', 'https://app.example.com/callback');
authorizeUrl.searchParams.set('response_type', 'code');
authorizeUrl.searchParams.set('scope', 'openid profile email');
authorizeUrl.searchParams.set('code_challenge', codeChallenge);
authorizeUrl.searchParams.set('code_challenge_method', 'S256');
window.location.href = authorizeUrl.toString();

// 2. On the callback page, exchange the code for tokens
const res = await fetch('https://acme.authagonal.io/connect/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: new URLSearchParams(window.location.search).get('code')!,
    redirect_uri: 'https://app.example.com/callback',
    client_id: 'my-app',
    code_verifier: codeVerifier,
  }),
});

const tokens = await res.json();
// tokens.id_token, tokens.access_token, tokens.refresh_token
Authagonal login page with email and password fields, branded with tenant logo

صفحة تسجيل الدخول الافتراضية لمستأجرك

وضع بيئة الاختبار

اختبر تكاملك في وضع بيئة الاختبار أولًا. تستخدم مستأجرو بيئة الاختبار عنوان URL منفصلًا ({slug}-sandbox.authagonal.io) ويمكن تحديثهم من بيئة الإنتاج في أي وقت دون التأثير على المستخدمين الفعليين.

لوحة التحكم

تمنحك لوحة التحكم في البوابة نظرة عامة في الوقت الفعلي على مستأجرك. فهي تُبرز المقاييس الأكثر أهمية: نمو المستخدمين، ونشاط المصادقة، والتنقل السريع إلى كل ميزة في البوابة.

نظرة عامة

في أعلى لوحة التحكم سترى رسالة ترحيب إلى جانب إجمالي عدد المستخدمين الحالي. وأسفل ذلك، يعرض مخطط المستخدمون النشطون يوميًا سجلًا لمدة 7 أيام للمستخدمين الفريدين الذين قاموا بالمصادقة كل يوم، مما يمنحك نبضًا سريعًا لاتجاهات التفاعل.

Full dashboard view showing welcome banner, user count, and Daily Active Users line chart

الشاشة الرئيسية للوحة التحكم مع مخطط المستخدمين النشطين يوميًا ونظرة عامة على النشاط

مقاييس النشاط

تعرض لوحة مقاييس النشاط أربع بطاقات إحصائية تلخّص أحداث المصادقة الرئيسية:

  • عمليات تسجيل الدخول الناجحة ، إجمالي تدفقات المصادقة المكتملة
  • عمليات تسجيل الدخول الفاشلة ، بيانات اعتماد غير صحيحة، أو حسابات مقفلة، أو رفض بسبب السياسة
  • المستخدمون النشطون ، المستخدمون الفريدون الذين قاموا بالمصادقة في الفترة المحددة
  • عمليات SCIM ، أحداث تزويد المستخدمين والمجموعات من موفّري الهوية المتصلين

استخدم عوامل تصفية النطاق الزمني للتبديل بين 24 ساعة و3 أيام و7 أيام و30 يومًا. تتحدّث جميع البطاقات الإحصائية والمخططات لتعكس النافذة المحددة.

Activity metrics panel with four stat cards and a time range filter bar showing 24h, 3d, 7d, and 30d options

مقاييس النشاط مع نطاق زمني قابل للتهيئة

التنقل السريع

أسفل لوحة المقاييس، تربط بطاقات التنقل مباشرةً بكل ميزة رئيسية: العملاء، والمستخدمون، والمجموعات، والأدوار، وSSO، وSCIM، والعلامة التجارية، والإعدادات. تعرض كل بطاقة وصفًا موجزًا حتى يتمكن أعضاء الفريق الجدد من توجيه أنفسهم بسرعة.

العملاء

يمثّل عملاء OAuth التطبيقات التي تُصادق المستخدمين عبر مستأجرك. لكل عميل تهيئته الخاصة لعناوين إعادة التوجيه، والنطاقات، وأنواع المنح، ومدد صلاحية الرموز، وسياسة MFA.

قائمة العملاء

تعرض صفحة العملاء جدولًا بجميع العملاء المسجّلين. يُظهر كل صف clientId، والاسم المعروض، وأنواع المنح المسموح بها كشارات ملونة، وما إذا كان PKCE مفعّلًا. انقر على أي صف لفتح محرّر التهيئة الكامل.

Clients table showing clientId, name, grant type badges, and PKCE status for each registered application

قائمة العملاء مع شارات أنواع المنح ومؤشرات PKCE

إنشاء عميل

انقر على إنشاء عميل لتسجيل تطبيق جديد. تحتاج إلى تقديم حقلين:

  • clientId ، معرّف فريد للعميل (مثل my-spa)
  • clientName ، اسم معروض مقروء للبشر
Create client form with clientId and clientName input fields

سجّل عميل OAuth جديدًا

حذف عميل

لحذف عميل، افتح تهيئة العميل وانقر على زر حذف العميل أسفل الصفحة. سيُطلب منك التأكيد قبل إزالة العميل نهائيًا. تُبطَل على الفور جميع الجلسات والرموز النشطة الخاصة بالعميل المحذوف.

مرجع تهيئة العميل

لكل عميل مجموعة شاملة من خيارات التهيئة منظّمة في عدة أقسام.

الإعدادات العامة

الإعدادالوصفالافتراضي
clientNameالاسم المعروض في شاشات الموافقة وفي البوابة
requirePkceاشتراط Proof Key for Code Exchange في تدفقات رمز التفويضمُفعّل
requireClientSecretاشتراط سر العميل لطلبات الرموز (عطّله للعملاء العامين مثل تطبيقات الصفحة الواحدة SPAs)مُعطّل
allowOfflineAccessالسماح للعميل بطلب رموز التحديث عبر نطاق offline_accessمُعطّل
alwaysIncludeUserClaimsInIdTokenتضمين جميع مطالبات المستخدم مباشرةً في رمز الهوية بدلًا من اشتراط استدعاء UserInfoمُعطّل
includeGroupsInTokensتضمين عضويات المستخدم في المجموعات كمطالبة groups في رمز الهويةمُعطّل

أمان PKCE

يقلّل تعطيل PKCE من أمان تدفقات رمز التفويض. لا تعطّل هذا إلا للعملاء القدامى الذين لا يدعمون PKCE. يجب أن تترك جميع التطبيقات الحديثة PKCE مفعّلًا.

العناوين (URIs)

تستخدم حقول URI إدخالًا على هيئة وسوم، اكتب قيمة واضغط Enter أو فاصلة لإضافتها. انقر على علامة X في أي وسم لإزالته.

الإعدادالوصف
redirectUrisعناوين رد النداء المسموح بها بعد المصادقة. يجب أن تطابق تمامًا معامل redirect_uri في طلبات التفويض.
postLogoutRedirectUrisالعناوين المسموح بإعادة التوجيه إليها بعد تسجيل الخروج.
allowedCorsOriginsالمصادر المسموح لها بإجراء طلبات عبر الأصول إلى نقطتي نهاية الرموز وUserInfo.
URI configuration section showing tag inputs for redirect URIs, post-logout URIs, and CORS origins

حقول إدخال على هيئة وسوم لتهيئة العناوين (URIs)

النطاقات وأنواع المنح

الإعدادالخيارات
allowedScopesopenid profile email offline_access
allowedGrantTypesauthorization_code client_credentials refresh_token device_code

مدد صلاحية الرموز

الإعدادالوصفالافتراضي
accessTokenLifetimeSecondsمدة صلاحية رموز الوصول1800 (30 دقيقة)
identityTokenLifetimeSecondsمدة صلاحية رموز الهوية300 (5 دقائق)
authorizationCodeLifetimeSecondsمدة صلاحية رموز التفويض للاستبدال300 (5 دقائق)
absoluteRefreshTokenLifetimeSecondsالحد الأقصى لمدة صلاحية رمز التحديث بغض النظر عن النشاط2592000 (30 يومًا)
slidingRefreshTokenLifetimeSecondsتُعاد ضبط مدة انتهاء رمز التحديث عند كل استخدام، حتى الحد الأقصى للمدة المطلقة1296000 (15 يومًا)
Token lifetime configuration fields with numeric inputs for each lifetime setting

اضبط مدد صلاحية الرموز لكل عميل

عناوين تسجيل الخروج

يمكن للعملاء تسجيل عناوين تسجيل خروج عبر القناة الخلفية والقناة الأمامية معًا. كلاهما أو أحدهما اختياري، اضبط ما يناسب طريقة مسح تطبيقك لجلسته.

الإعدادالوصف
backChannelLogoutUriطلب POST من خادم إلى خادم مع رمز تسجيل خروج موقّع. موثوق حتى عندما يكون متصفّح المستخدم غير متصل.
frontChannelLogoutUriيُعرض في إطار iframe مخفي أثناء تسجيل الخروج حتى يمسح المتصفّح ملفات تعريف الارتباط والتخزين المحلي.
frontChannelLogoutSessionRequiredعند تفعيله، يتلقى عنوان تسجيل الخروج معاملي الاستعلام iss وsid حتى يتمكن تطبيقك من ربط تسجيل الخروج بالجلسة المحددة.

استخدمهما معًا

تضمن القناة الخلفية إبلاغ الخادم، بينما تمسح القناة الأمامية المتصفّح. تستفيد معظم التطبيقات من تهيئة كليهما.

سياسة MFA

يمكن لكل عميل تجاوز سياسة MFA على مستوى المستأجر بإعداد خاص بكل عميل. تقدّم قائمة سياسة MFA المنسدلة ثلاثة خيارات:

السياسةالسلوك
مُعطّلةلا يُطلب MFA أبدًا لهذا العميل
مُفعّلةيمكن للمستخدمين التسجيل اختياريًا في MFA، وسيُطلب منهم إذا كانوا مسجّلين
مطلوبةيجب على جميع المستخدمين إكمال MFA للمصادقة عبر هذا العميل
MFA policy dropdown showing Disabled, Enabled, and Required options on the client configuration page

تجاوز سياسة MFA لكل عميل

SSO للمؤسسات

يتيح SSO للمؤسسات لعملائك استخدام موفّر الهوية الخاص بهم. يدعم Authagonal كلًا من اتحاد SAML 2.0 وOIDC مع التوجيه القائم على النطاق، بحيث يُوجَّه المستخدمون تلقائيًا إلى موفّر الهوية الصحيح بناءً على عنوان بريدهم الإلكتروني.

SSO domain routing flow — shows how email domains are matched to SAML or OIDC identity providers

التوجيه القائم على النطاق لـ SSO

اتصالات SAML 2.0

لإنشاء اتصال SAML، انتقل إلى صفحة SSO وحدّد علامة التبويب SAML. قدّم ما يلي:

الحقلالوصف
connectionNameاسم مقروء للبشر لهذا الاتصال (مثل "Acme Corp Okta")
entityIdمعرّف كيان SP الخاص بك. سجّل هذه القيمة نفسها لدى IdP كمعرّف التطبيق (Entity ID)؛ ويجب أن تذكرها التأكيدات بوصفها Audience
metadataUrlعنوان URL لمستند XML لبيانات تعريف SAML الخاص بـ IdP
metadataXmlXML لبيانات تعريف IdP ملصوق، من أجل IdP بلا عنوان URL لبيانات التعريف (Google Workspace) أو يتعذر الوصول إلى عنوانه من الإنترنت. قدّم هذا أو metadataUrl، وليس كليهما
nameIdFormatتنسيق NameID اختياري يُطلب من IdP. اتركه فارغًا للافتراضي emailAddress، أو اضبطه على "none" لإسقاط NameIDPolicy كليًا (موصى به مع ADFS)

عند حفظ الاتصال، يجلب Authagonal وثيقة البيانات الوصفية ويستورد شهادة التوقيع الخاصة بموفّر الهوية، وعنوان URL لنقطة نهاية SSO، وصيغة معرّف الاسم. تُحدّث البيانات الوصفية دوريًا لالتقاط عمليات تدوير الشهادات.

SAML connection creation form with fields for connection name, entity ID, and metadata URL

إنشاء اتصال SSO بـ SAML 2.0

اتصالات OIDC

لإنشاء اتصال اتحاد OIDC، حدّد علامة التبويب OIDC وقدّم:

الحقلالوصف
connectionNameاسم مقروء للبشر لهذا الاتصال
discoveryUrlعنوان اكتشاف OpenID Connect (مثل https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration)
clientIdمعرّف العميل المسجّل لدى موفّر الهوية الخارجي لهذا الاتحاد
clientSecretسر العميل لتسجيل موفّر الهوية الخارجي
OIDC connection creation form with fields for connection name, discovery URL, client ID, and client secret

إنشاء اتصال اتحاد OIDC

التوجيه القائم على النطاق

يعيد التوجيه القائم على النطاق توجيه المستخدمين تلقائيًا إلى موفّر الهوية الصحيح بناءً على نطاق بريدهم الإلكتروني. عندما يُدخل مستخدم بريده الإلكتروني في صفحة تسجيل الدخول، يتحقق Authagonal مما إذا كان جزء النطاق (مثل acme.com) يطابق أي اتصال SSO مهيّأ. وإذا تطابق، يُعاد توجيه المستخدم بسلاسة إلى موفّر الهوية الخاص بمؤسسته.

نطاق البريد الإلكترونيموفّر SSOالبروتوكول
acme.comAcme Corp OktaSAML 2.0
contoso.comContoso Azure ADOIDC
example.orgExample OneLoginSAML 2.0
Domain routing table showing email domains mapped to SSO connections with protocol type

يربط التوجيه القائم على النطاق نطاقات البريد الإلكتروني بموفّري الهوية

التدفق الذي يبدأه موفّر الخدمة (SP)

التدفق الذي يبدأه موفّر الخدمة هو الافتراضي، إذ يبدأ المستخدمون من صفحة تسجيل الدخول الخاصة بك ويُوجَّهون تلقائيًا إلى موفّر الهوية الصحيح. يمكن أيضًا ربط المستخدمين مباشرةً باتصال محدد عبر /saml/{connectionId}/login أو /oidc/{connectionId}/login.

تزويد JIT

بشكل افتراضي، عندما يسجّل مستخدم الدخول عبر SSO لأول مرة ولم يكن موجودًا بالفعل في مستأجرك، ينشئ Authagonal حسابه تلقائيًا (التزويد الفوري Just-In-Time). يمكن تعطيل ذلك لكل اتصال عبر تحديد تعطيل تزويد JIT عند إنشاء الاتصال أو تحريره.

عند تعطيل تزويد JIT، لا يمكن تسجيل الدخول عبر ذلك الاتصال إلا للمستخدمين الذين تم تزويدهم مسبقًا، سواء عبر SCIM أو صفحة المستخدمين في البوابة أو الـ API. يتلقى المستخدمون غير المعروفين خطأ access_denied ويُوجَّهون للتواصل مع المسؤول الخاص بهم.

إعداد لكل اتصال

يُتحكَّم في تزويد JIT لكل اتصال SSO، وليس على مستوى المستأجر بالكامل. يمكنك أن يكون لديك اتصال يسمح بـ JIT (مثلًا لمؤسسة شريكة تدير مستخدميها بنفسها) وآخر يتطلب التزويد المسبق (مثلًا لعميل مؤسسي يستخدم مزامنة SCIM).

اختبر قبل الطرح

اختبر اتصالات SSO في وضع بيئة الاختبار قبل طرحها على مستخدمي الإنتاج. يتيح لك ذلك التحقق من تهيئة موفّر الهوية، وربط السمات، والتوجيه القائم على النطاق دون التأثير على تدفقات المصادقة الفعلية.

المستخدمون

تتيح لك صفحة المستخدمين إدارة جميع المستخدمين النهائيين في مستأجرك. يمكنك البحث عن المستخدمين، وعرض تفاصيلهم، وإنشاء حسابات جديدة، ومعرفة كيفية تزويد كل مستخدم.

يدعم شريط البحث التصفية حسب عنوان البريد الإلكتروني أو معرّف المستخدم. يجري البحث بتأخير قدره 300 مللي ثانية بحيث تتحدّث النتائج أثناء الكتابة دون إثقال الـ API. تُرقَّم النتائج بمعدل 50 مستخدمًا لكل صفحة، استخدم عناصر التحكم في التنقل أسفل الجدول للانتقال بين الصفحات.

جدول المستخدمين

يعرض جدول المستخدمين الأعمدة التالية لكل مستخدم:

العمودالوصف
البريد الإلكترونيعنوان البريد الإلكتروني للمستخدم، يُعرض مع شارة تحقق إذا تم تأكيد البريد الإلكتروني
معرّف المستخدمالمعرّف الفريد المخصّص للمستخدم
الاسم الكاملالاسم الأول واسم العائلة مجتمعين
الحالةActive أو Inactive ، يشير إلى ما إذا كان الحساب مُفعّلًا
MFAEnabled أو Off ، ما إذا كانت المصادقة متعددة العوامل مُسجَّلة
المصدرSCIM أو Local ، كيفية إنشاء المستخدم
تاريخ الإنشاءتاريخ إنشاء حساب المستخدم
User list table with columns for email, user ID, name, status, MFA, source, and created date

قائمة المستخدمين مع شريط البحث والترقيم

إنشاء المستخدمين

انقر على إنشاء مستخدم لإضافة مستخدم محلي جديد. يتطلب النموذج ما يلي:

الحقلالوصف
emailعنوان البريد الإلكتروني للمستخدم (يجب أن يكون فريدًا داخل المستأجر)
passwordكلمة المرور الأولية (8 أحرف كحد أدنى، ويجب أن تستوفي سياسة كلمات المرور الخاصة بمستأجرك)
firstNameالاسم الأول للمستخدم
lastNameاسم عائلة المستخدم
languageاللغة المفضّلة. تحدّد لغة واجهة المستخدم والبريد الإلكتروني للمستخدم، وهي اختيارية وتعود افتراضيًا إلى الإنجليزية.
Create user form with email, password, first name, last name, and preferred Language fields

إنشاء مستخدم محلي جديد

المستخدمون المُزوَّدون عبر SCIM

يُوسَم المستخدمون المُنشَؤون عبر SCIM بشارة "SCIM" ولا يمكن تغيير كلمة مرورهم عبر البوابة. تُدار دورة حياتهم بالكامل، من الإنشاء والتحديثات والتعطيل، بواسطة موفّر الهوية الأساسي.

اللغة المفضّلة

لكل مستخدم لغة مفضّلة تتحكم في كل من واجهته المستضافة ورسائل البريد الإلكتروني الخاصة بالمعاملات التي يرسلها له Authagonal (التحقق، وإعادة ضبط كلمة المرور، والترحيب، وغير ذلك). يمكنك تعيينها عند إنشاء المستخدم وتغييرها في أي وقت من صفحة تفاصيل المستخدم. إذا لم تكن لدى المستخدم لغة مفضّلة محددة، يعود Authagonal افتراضيًا إلى الإنجليزية. يقدّم المُحدِّد جميع اللغات المدعومة: الإنجليزية، والألمانية، والفرنسية، والإسبانية، والبرتغالية، والفيتنامية، والصينية المبسّطة.

User detail edit form with profile fields including a preferred Language selector

عيّن اللغة المفضّلة للمستخدم في صفحة التفاصيل

تفاصيل المستخدم

انقر على أي صف في قائمة المستخدمين لفتح صفحة تفاصيله. من هناك يمكنك تحرير بيانات الملف الشخصي، وإدارة الأدوار، وإعادة ضبط MFA، ومراجعة السمات المخصصة، وحذف المستخدم.

User detail page showing profile fields, status, assigned roles, and custom attributes

الملف الشخصي

حرّر البريد الإلكتروني، والاسم الأول/الأخير، والهاتف، والشركة، والمعرّف الخارجي، وبدّل علامة نشاط المستخدم. يجب أن تبقى تغييرات البريد الإلكتروني فريدة عبر المستأجر، ويُرجع الـ API email_in_use إذا كان مستخدمًا.

الأدوار

عيّن الأدوار المعرّفة في صفحة الأدوار وألغِ تعيينها. تظهر عضوية الأدوار في رموز الهوية والوصول عندما يكون لدى العميل includeRolesInTokens مفعّلًا.

المصادقة متعددة العوامل

اطّلع على كل بيانات اعتماد MFA المسجّلة للمستخدم، مثل تطبيق المصادقة (TOTP)، وWebAuthn/مفاتيح المرور، ورموز الاسترداد، لكل منها طوابعها الزمنية الخاصة بالتسجيل وآخر استخدام. أزِل بيانات اعتماد فردية، أو أعد ضبط جميع عوامل MFA. تجبر إعادة الضبط المستخدم على إعادة التسجيل عند تسجيل الدخول التالي.

السمات المخصصة

بيانات مفتاح/قيمة اعتباطية مرتبطة بالمستخدم. يجب أن تكون المفاتيح فريدة. تُكشف السمات عبر API الملف الشخصي للمستخدم وعبر SCIM، ويمكن ربطها بمطالبات رمز الوصول عبر تهيئة userClaims لنطاق مخصص.

حذف المستخدم

يزيل المستخدم وجميع بيانات اعتماد MFA الخاصة به نهائيًا. اكتب عنوان البريد الإلكتروني للمستخدم للتأكيد، فلا يمكن التراجع عن ذلك.

المجموعات

تتيح لك المجموعات تنظيم المستخدمين وتضمين عضوية المجموعة في الرموز. يمكن إنشاء المجموعات يدويًا في البوابة أو تزويدها تلقائيًا عبر SCIM من مزوّد هوية خارجي.

قائمة المجموعات

تعرض صفحة المجموعات جميع المجموعات في المستأجر الخاص بك مع المعلومات التالية:

العمودالوصف
اسم المجموعةالاسم المعروض للمجموعة
الأعضاءعدد المستخدمين الموجودين حاليًا في المجموعة
المصدرSCIM أو Manual كيفية إنشاء المجموعة
تاريخ الإنشاءتاريخ إنشاء المجموعة
Groups list table showing group name, member count, source badge, and created date

قائمة المجموعات مع مؤشرات المصدر

إنشاء مجموعة

انقر فوق إنشاء مجموعة وأدخِل displayName للمجموعة. ينبغي أن تكون أسماء المجموعات وصفية وفريدة داخل المستأجر الخاص بك (مثل "Engineering" و"Billing Admins" و"Beta Testers").

تفاصيل المجموعة والأعضاء

انقر فوق أي مجموعة لفتح عرض التفاصيل. هنا يمكنك رؤية جميع الأعضاء الحاليين وإدارة العضوية:

  • إضافة أعضاء: أدخِل معرّف المستخدم لإضافة مستخدم إلى المجموعة.
  • إزالة الأعضاء: انقر فوق زر الإزالة بجوار أي عضو لإزالته بشكل فردي.
Group detail view showing member list with user IDs and a field to add new members

إدارة عضوية المجموعة في عرض التفاصيل

المجموعات في الرموز

عند تفعيل includeGroupsInTokens على عميل، يتضمن رمز الهوية مطالبة groups تحتوي على عضويات المستخدم في المجموعات. يتضمن كل إدخال معرّف المجموعة id واسمها name:

groups claim in ID token
{
  "sub": "user-123",
  "email": "[email protected]",
  "groups": [
    { "id": "grp-001", "name": "Engineering" },
    { "id": "grp-002", "name": "Beta Testers" }
  ]
}

التفعيل لكل عميل

يُضبط إعداد includeGroupsInTokens على كل عميل على حدة. انتقل إلى الإعدادات العامة للعميل لتفعيله.

الأدوار

تدعم الأدوار التحكم في الوصول المستند إلى الأدوار (RBAC) في تطبيقك. عرّف الأدوار في Authagonal، وخصّصها للمستخدمين، واستخدم مطالبة roles في الرموز لفرض التفويض في منطق تطبيقك.

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

تعرض صفحة الأدوار جدولًا بجميع الأدوار المعرّفة مع التحرير المباشر. لكل دور:

العمودالوصف
الاسممعرّف فريد للدور (مثل "admin" و"editor" و"viewer")
الوصفوصف مقروء يوضّح ما يمنحه الدور
تاريخ الإنشاءتاريخ إنشاء الدور

إنشاء دور

انقر فوق إنشاء دور وقدّم اسمًا ووصفًا. ينبغي أن تكون أسماء الأدوار موجزة وأن تتبع اصطلاح تسمية متسقًا عبر تطبيقك (مثل الأحرف الصغيرة مع الشرطات: billing-admin).

التحرير المباشر

تدعم الأدوار التحرير المباشر مباشرةً في الجدول. انقر فوق أيقونة القلم على أي دور للدخول إلى وضع التحرير، فتصبح حقول الاسم والوصف قابلة للتحرير. عدّل القيم، ثم انقر فوق أيقونة علامة الصح للحفظ. تسري التغييرات على الفور.

حذف دور

انقر فوق أيقونة الحذف على أي دور لإزالته. سيُطلب منك التأكيد قبل حذف الدور نهائيًا. لا تؤدي إزالة دور إلى إبطال الرموز الحالية بأثر رجعي، إذ سيغيب الدور عن الرموز الجديدة الصادرة بعد الحذف.

Roles table with inline editing active, showing editable name and description fields with save and cancel icons

التحرير المباشر للأدوار في جدول الأدوار

الأدوار في الرموز

تُضمَّن الأدوار المخصصة لمستخدم كمطالبة roles في رمز الهوية. يمكن لتطبيقك قراءة هذه المطالبة لاتخاذ قرارات التفويض:

roles claim in ID token
{
  "sub": "user-123",
  "email": "[email protected]",
  "roles": ["admin", "billing-admin"]
}

تزويد SCIM

يتيح SCIM 2.0 (نظام إدارة الهوية عبر النطاقات) التزويد التلقائي للمستخدمين والمجموعات من مزوّدي الهوية المؤسسية مثل Okta وAzure AD وOneLogin وJumpCloud. عند ضبطه، تُزامَن حسابات المستخدمين وعضويات المجموعات تلقائيًا من مزوّد الهوية الأعلى إلى المستأجر الخاص بك في Authagonal.

SCIM provisioning flow — shows user lifecycle events flowing from enterprise IdP through Authagonal SCIM API to your app via TCC webhooks

مزامنة دورة حياة مستخدم SCIM مع التزويد إلى الأنظمة التابعة

خطوات الإعداد

اتبع هذه الخطوات لتفعيل تزويد SCIM لعميل:

  1. اختر تطبيق العميل: اختر عميل OAuth الذي سيرتبط به تزويد SCIM.
  2. أنشئ رمز SCIM: قدّم وصفًا ومدة صلاحية بالأيام، ثم أنشئ الرمز.
  3. انسخ الرمز فورًا: تُعرض قيمة الرمز الخام مرة واحدة فقط. انسخها قبل إغلاق مربع الحوار.
  4. اضبط مزوّد الهوية لديك: في إعدادات SCIM لمزوّد الهوية، أدخِل عنوان URL الأساسي ورمز الحامل.
  5. اختبر مزامنة المستخدمين: شغّل مزامنة اختبارية من مزوّد الهوية وتحقق من ظهور المستخدمين في بوابة Authagonal.

عنوان URL الأساسي لـ SCIM

اضبط مزوّد الهوية لديك بعنوان URL الأساسي التالي:

SCIM Base URL
https://{slug}.authagonal.io/scim/v2

استبدل {slug} بسلَج المستأجر الخاص بك.

SCIM configuration page showing client selector, token generation form, and base URL

صفحة إعداد SCIM مع إنشاء الرموز

إدارة الرموز

تصادق رموز SCIM على طلبات التزويد الواردة من مزوّد الهوية لديك. يمكنك إدارة عدة رموز لكل عميل:

الحقلالوصف
الوصفتسمية لتحديد الرمز (مثل "Okta Production SCIM")
انتهاء الصلاحيةعمر الرمز بالأيام (من 1 إلى 3650). اترك الحقل فارغًا أو اضبط قيمة طويلة للرموز التي لا ينبغي تدويرها بشكل متكرر.
الحالةالرموز النشطة قيد الاستخدام. تعرض الرموز المُبطَلة شارة Revoked ولم يعد بإمكانها المصادقة على الطلبات.

لإبطال رمز، انقر فوق زر إبطال المجاور له. تبقى الرموز المُبطَلة مرئية في القائمة لأغراض التدقيق لكنها تتوقف فورًا عن قبول الطلبات.

SCIM token list showing active and revoked tokens with description, expiry date, and revoke button

إدارة الرموز مع مؤشرات الرموز النشطة والمُبطَلة

انسخ الرمز فورًا

يُعرض رمز SCIM الخام مرة واحدة فقط عند إنشائه. انسخه فورًا، فلا يمكن استرجاعه لاحقًا. إذا فقدت الرمز، فستحتاج إلى إنشاء رمز جديد وتحديث إعدادات مزوّد الهوية لديك.

اختبار الاتصال

تحقق من أن تكامل SCIM لديك يعمل عبر الاستعلام عن نقطة نهاية ServiceProviderConfig:

Test SCIM connectivity
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://acme.authagonal.io/scim/v2/ServiceProviderConfig

تُعيد الاستجابة الناجحة مستند JSON يصف ميزات SCIM المدعومة، بما في ذلك العمليات المجمّعة والتصفية وإمكانية تغيير كلمة المرور.

اللغة المفضّلة

تُربَط سمة SCIM المسماة preferredLanguage (مع الرجوع إلى locale) بلغة المستخدم المخزّنة. يتلقى مستخدمو SSO المزوّدون عبر SCIM رسائل بريد إلكتروني مترجمة تلقائيًا باللغة التي يرسلها مزوّد الهوية لديهم.

نطاقات OAuth

تتيح النطاقات للعملاء طلب شرائح محددة من بيانات المستخدم أو أذوناته. يدعم Authagonal نطاقات OIDC القياسية والنطاقات المخصصة التي تعرّفها لواجهات API الخاصة بك.

النطاقات المدمجة

النطاقالوصف
openidمطلوب لأي تدفق OpenID Connect. يُصدر رمز هوية.
profileيعيد مطالبات الملف الشخصي القياسية (name وgiven_name وfamily_name).
emailيعيد عنوان البريد الإلكتروني للمستخدم وحالة التحقق منه.
offline_accessيُصدر رمز تحديث إلى جانب رمز الوصول.

النطاقات المخصصة

عرّف نطاقاتك الخاصة في صفحة النطاقات. يصف كل نطاق إذناً أو مورداً يمكن للعميل طلبه (على سبيل المثال، billing.read وorders.write).

Custom scope creation form with name, display name, description and User Claims fields
الحقلالوصف
nameمعرّف النطاق المُرسَل في طلبات الرموز (مثل billing.read).
displayNameتسمية مقروءة تظهر على شاشة الموافقة.
descriptionشرح أطول يظهر أسفل اسم العرض عند الموافقة.
userClaimsمطالبات إضافية تُضاف إلى رمز الوصول عند منح هذا النطاق.
showInDiscoveryDocumentإذا كان مفعّلاً، يظهر النطاق في /.well-known/openid-configuration.
emphasizeيُبرز النطاق على شاشة الموافقة باعتباره حسّاساً.
requiredيمنع المستخدم من إلغاء تحديد النطاق أثناء الموافقة.

تكامل الموافقة

يطلب العملاء الذين لديهم RequireConsent: true الموافقة من المستخدم عند أول طلب. وحذف نطاق لا يبطل الرموز الصادرة بالفعل، فأبطلها صراحةً إذا لزم الأمر.

مطالبات مخصصة على الرموز

للمطالبات المخصصة شقّان. المصدر هو بيانات خاصة بكل مستخدم: لكل AuthUser قاموس customAttributes يمكنك تعبئته من البوابة (المستخدمون ← المستخدم ← السمات المخصصة) أو عبر SCIM أو عبر خطاف تزويد TCC. أما الإطلاق فهو خاص بكل نطاق: تسمّي قائمة userClaims لكل نطاق المفاتيح التي تسمح بمغادرتها للخادم.

عندما يطلب عميل نطاقات، يمرّ Authagonal على النطاقات الممنوحة، ويوحّد قوائم userClaims الخاصة بها، ولا يُصدر إلا تلك المفاتيح من customAttributes الخاصة بالمستخدم. وتُسقَط المفاتيح غير المعروفة بصمت، فلا يستطيع عميل قراءة سمة بتخمين اسمها. أما مطالبات OIDC القياسية (sub وemail وname وغيرها) فتتبع المواصفة ولا تخضع للقائمة البيضاء.

Example: project-scope claims on an access token
# 1. On the user (Portal → Users → {user} → Custom Attributes)
department = "engineering"
employee_id = "E-1042"
seat_tier = "enterprise"

# 2. On a custom scope (Portal → Scopes → projects.read)
name        = "projects.read"
userClaims  = ["department", "seat_tier"]   # <-- whitelist

# 3. Client requests scope=openid projects.read
# Decoded access token (relevant fields only):
{
  "sub": "u-9b…",
  "scope": "openid projects.read",
  "department": "engineering",
  "seat_tier":  "enterprise"
  // employee_id is NOT emitted — it's not in the whitelist for any granted scope.
}

مطالبات الفيدرالية تتجاوز الإعداد لكل جلسة

عندما يسجّل مستخدم دخوله عبر موفّر هوية أصلي (SAML/OIDC SSO)، فإن المطالبات الخاصة بالجلسة الواردة من موفّر الهوية، مثل سمة department المُطابَقة من تأكيد SAML، تمرّ عبر القائمة البيضاء للنطاقات نفسها لكنها تغلب عند تعارض المفاتيح على customAttributes المُخزّنة. وتُصدر على رموز هذه الجلسة (وتبقى عبر دورات التحديث) دون أن تُكتب مرة أخرى في سجل المستخدم.

إسناد النطاقات إلى العملاء

أضف النطاقات المسموح بها في تبويب العملاء ← النطاقات & المنح. لا يمكن للعميل طلب سوى النطاقات الممنوحة له؛ وتُرفض النطاقات غير المعروفة بـ invalid_scope.

العلامة التجارية

خصّص مظهر صفحات تسجيل الدخول الخاصة بالمستأجر وأسلوبها. تتيح لك إعدادات العلامة التجارية مطابقة تجربة المصادقة مع الهوية البصرية لمنتجك، من الشعارات والألوان إلى تجاوزات CSS المتقدمة.

المظهر

الإعدادالوصف
appNameاسم التطبيق المعروض في ترويسة صفحة تسجيل الدخول وعلامة تبويب المتصفح
logoUrlعنوان URL لصورة شعارك. يُعرض في أعلى صفحة تسجيل الدخول. الحجم الموصى به: 200×60 بكسل أو نسبة أبعاد مماثلة.
primaryColorلون العلامة التجارية الأساسي المستخدم للأزرار والروابط وحالات التركيز. يُضبط عبر منتقي الألوان أو إدخال قيمة سداسية عشرية. تُحدَّث المعاينة المباشرة أثناء تغييرك للقيمة.
customCssUrlعنوان URL لملف CSS خارجي يُحمَّل بعد الأنماط الافتراضية. استخدمه لتجاوزات الأنماط المتقدمة.
Branding appearance settings with app name input, logo URL field, color picker with hex input, and custom CSS URL field

إعدادات المظهر مع معاينة مباشرة للألوان

معلومات الاتصال

الإعدادالوصف
supportEmailعنوان بريد إلكتروني للدعم يُعرض على صفحات تسجيل الدخول. يراه المستخدمون عندما يحتاجون إلى مساعدة بشأن حساباتهم.

مفاتيح تبديل صفحة تسجيل الدخول

تحكّم في العناصر التي تظهر على صفحة تسجيل الدخول الخاصة بالمستأجر:

التبديلالوصفالافتراضي
showForgotPasswordإظهار رابط "نسيت كلمة المرور؟" في نموذج تسجيل الدخولمُفعّل
showRegistrationإظهار رابط "إنشاء حساب" لتسجيل المستخدمين بالخدمة الذاتيةمُفعّل
showPoweredByإظهار شارة "Powered by Authagonal" في أسفل صفحة تسجيل الدخولمُفعّل
A customized login page showing a branded logo, custom primary color on the sign-in button, and support email in the footer

مثال على صفحة تسجيل دخول مع تطبيق علامة تجارية مخصصة

CSS مخصص

للتحكم الكامل في مظهر صفحة تسجيل الدخول، قدّم عنوان URL لملف CSS في إعدادات علامتك التجارية. يُحمَّل الملف بعد الأنماط الافتراضية، لذا تكون الأولوية لقواعدك.

خصائص CSS المخصصة

تدعم صفحة تسجيل الدخول خصائص CSS المخصصة (المتغيرات) للتجاوزات الشائعة. اضبطها في ملف CSS الخاص بك لتغيير الألوان والخطوط والشكل دون كتابة محدِّدات معقدة.
/* your-custom-styles.css */
:root {
--auth-bg: #1a1a2e;
--auth-card-bg: #16213e;
--auth-heading: #e0e0e0;
--auth-radius: 12px;
--auth-font: 'Inter', sans-serif;
}
المتغيرالوصفالافتراضي
--auth-bgلون خلفية الصفحة#f3f4f6
--auth-card-bgخلفية بطاقة تسجيل الدخولwhite
--auth-headingلون نص العنوان#111827
--auth-radiusنصف قطر حدود البطاقة0.5rem
--auth-fontعائلة الخطinherit

الوضع الداكن

يأتي تطبيق تسجيل الدخول بسمات فاتحة وداكنة وتابعة للنظام. يختار المستخدمون من مفتاح تبديل على صفحة تسجيل الدخول، ويستمر الاختيار عبر الجلسات. عند الضبط على system، يتتبع التطبيق أحادي الصفحة قيمة prefers-color-scheme بشكل مباشر.

تُعلَن القيم الفاتحة عند :root، وتُحصر التجاوزات الداكنة ضمن .dark. تكون الأولوية دائمًا للعلامة التجارية للمستأجر المضبوطة عبر customCssUrl، لذا تستمر ألوانك بغض النظر عن سمة المستخدم.

محدِّدات العناصر

للتحكم الأدق، استهدف عناصر محددة باستخدام سمات data-auth. هذه المحدِّدات مستقرة عبر التحديثات، فلن تتعطل عند تغييرنا لأسماء الفئات الداخلية.
المحدِّدالعنصر
[data-auth="page"]حاوية خلفية الصفحة الكاملة
[data-auth="header"]منطقة الشعار واسم التطبيق
[data-auth="logo"]صورة الشعار
[data-auth="app-name"]عنوان اسم التطبيق (عند عدم ضبط شعار)
[data-auth="content"]منطقة المحتوى الرئيسية (النماذج والرسائل)
[data-auth="login-form"]عنصر نموذج تسجيل الدخول
[data-auth="email-field"]غلاف حقل إدخال البريد الإلكتروني
[data-auth="password-field"]غلاف حقل إدخال كلمة المرور
[data-auth="submit-button"]زر تسجيل الدخول
[data-auth="languages"]شريط منتقي اللغة

الإعدادات

اضبط سياسات الأمان على مستوى المستأجر وخطافات الويب وإعدادات البيئة. تنطبق هذه الإعدادات عالميًا عبر جميع العملاء ما لم تُتجاوز على مستوى العميل.

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

حدّد متطلبات تعقيد كلمات المرور لجميع المستخدمين في المستأجر الخاص بك:

الإعدادالنطاقالافتراضي
minPasswordLength6 – 1288
requireUppercaseمُفعّل / معطّلمُفعّل
requireLowercaseمُفعّل / معطّلمُفعّل
requireDigitمُفعّل / معطّلمُفعّل
requireSpecialCharمُفعّل / معطّلمُفعّل
Password policy settings showing minimum length slider and toggle switches for character requirements

ضبط سياسة كلمات المرور

سياسة MFA

تحدّد سياسة MFA على مستوى المستأجر السلوك الافتراضي للمصادقة متعددة العوامل. يمكن للعملاء الأفراد تجاوز هذا الإعداد.

السياسةالسلوك
DisabledMFA غير متاحة. لا يمكن للمستخدمين التسجيل في MFA.
EnabledMFA اختيارية. يمكن للمستخدمين اختيار التسجيل وسيُطلَب منهم إدخالها عند تسجيل الدخول إذا كانوا مسجَّلين.
RequiredMFA إلزامية. يجب على جميع المستخدمين التسجيل في MFA وإكمال العامل الثاني في كل تسجيل دخول.

الجلسة والإقفال

تحكّم في مدة الجلسة وسلوك إقفال الحساب:

الإعدادالنطاقالافتراضي
sessionLifetimeMinutes5 – 43,200 (30 يومًا)60
maxFailedAttempts1 – 1005
lockoutDurationMinutes1 – 1,440 (24 ساعة)10
Session and lockout settings with numeric inputs for session lifetime, max failed attempts, and lockout duration

ضبط الجلسة والإقفال

خطافات الويب

تتيح لك خطافات الويب التفاعل مع أحداث المصادقة في الوقت الفعلي. هناك حدثان (onUserAuthenticated وonTokenIssued) قابلان للفرض، فهما يُطلَقان افتراضيًا بشكل غير متزامن ولا يحجبان المستخدم، لكن يمكنك اختيار الفرض لكل حدث بحيث ترفض الإجراءَ استجابةٌ خارج نطاق 2xx أو جسمُ {"allow": false}. أما الأحداث المتبقية فهي إشعارات تُطلَق دائمًا بأسلوب إطلاق ونسيان، ولا تحجب أبدًا.

الحدثالنوعالوصف
onUserAuthenticatedقابل للفرضيُطلَق بعد تسجيل دخول ناجح. يكون افتراضيًا بأسلوب إطلاق ونسيان حتى لا يتأثر زمن استجابة تسجيل الدخول. بدّل <code>webhookEnforceUserAuthenticated</code> لجعله حاجبًا، فعندئذٍ ترفض تسجيلَ الدخول استجابةٌ خارج نطاق 2xx أو جسمُ <code>{"allow": false}</code>.
onTokenIssuedقابل للفرضيُطلَق قبل سَكّ الرموز (authorization_code وrefresh_token وclient_credentials). يكون افتراضيًا بأسلوب إطلاق ونسيان. بدّل <code>webhookEnforceTokenIssued</code> لجعله حاجبًا، فعندئذٍ تمنع إصدارَ الرمز استجابةٌ خارج نطاق 2xx أو جسمُ <code>{"allow": false}</code>.
onUserCreatedإشعارإشعار بأسلوب إطلاق ونسيان عند تسجيل مستخدم جديد أو تزويده عبر SCIM.
onUserUpdatedإشعارإشعار بأسلوب إطلاق ونسيان عند تحديث سجل مستخدم (تغييرات الملف الشخصي، تغييرات الأدوار، تحديثات SCIM).
onUserDeletedإشعارإشعار بأسلوب إطلاق ونسيان عند حذف مستخدم، سواء عبر البوابة/SCIM أو بحكم سياسة الاحتفاظ.
onLoginFailedإشعارإشعار بأسلوب إطلاق ونسيان عند فشل محاولة تسجيل دخول بسبب بيانات اعتماد خاطئة أو إقفال أو رفض من السياسة.

إعدادات إضافية لخطافات الويب:

الإعدادالنطاقالافتراضيالوصف
webhookTimeoutSeconds1 – 305أقصى مدة انتظار لاستجابة خطاف ويب خاص بالفرض قبل انتهاء المهلة
webhookFailOpenمُفعّل / معطّلمُفعّلعند التفعيل، إذا تعذّر الوصول إلى خطاف ويب خاص بالفرض أو انتهت مهلته، يُسمح بمتابعة العملية
Webhook configuration section showing URL inputs for each event type, timeout slider, and fail-open toggle

ضبط أحداث خطاف الويب

توفر خطاف الويب الخاص بالفرض

يمكن لخطافات الويب الخاصة بالفرض أن تحجب تدفقات المصادقة. إذا تعطلت نقطة نهاية خطاف الويب لديك وكان webhookFailOpen معطّلًا، فلن يتمكن أي مستخدم من تسجيل الدخول. استخدم وضع الفشل المفتوح ما لم تكن لديك متطلبات امتثال صارمة تفرض الحجب عند فشل خطاف الويب.

التحقق من خطافات الويب

بمجرد ضبط أي عنوان URL لخطاف ويب، يَسُكّ Authagonal سرّ توقيع خاصًا بكل مستأجر (قيمة whsec_… تُعرض للقراءة فقط ضمن الإعدادات ← خطافات الويب). يحمل كل تسليم صادر ترويسة X-Authagonal-Signature: t=<unix>,v1=<hex>، حيث يكون v1 هو HMAC-SHA256(secret, "{t}.{body}") محسوبًا على جسم الطلب الخام. أعِد حسابه على نقطة النهاية لديك وقارنه بزمن ثابت للتأكد من أن الطلب وارد فعلًا من Authagonal ولم يُعبَث به، وارفض عمليات التسليم التي تكون قيمة t فيها قديمة جدًا لمنع هجمات إعادة التشغيل.

التحقق من خطاف ويب (Node.js)
import crypto from 'node:crypto';

// rawBody MUST be the exact bytes Authagonal sent — verify before any JSON re-serialization.
function verifyAuthagonalWebhook(signatureHeader, rawBody, signingSecret) {
  const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('=')));
  const { t, v1 } = parts;

  // Replay protection: reject deliveries older than 5 minutes.
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;

  const expected = crypto
    .createHmac('sha256', signingSecret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  return v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

تدوير سرّ التوقيع

استخدم إعادة الإنشاء بجوار سرّ التوقيع لتدويره، على سبيل المثال بعد الاشتباه في تسرّب. يُبطَل السرّ السابق فورًا، لذا حدّث أداة التحقق لديك بالقيمة الجديدة وإلا فستبدأ عمليات التسليم الجارية بالفشل في فحص التوقيع.

نافذة الصيانة

حدّد نافذة صيانة مفضّلة للعمليات المعطِّلة مثل تدوير الشهادات وتحديثات البنية التحتية. اختر ساعة بتوقيت UTC (من 0 إلى 23)، وتعرض البوابة أيضًا التوقيت المكافئ في منطقتك الزمنية المحلية للتيسير.

بيئة الاختبار

بيئة الاختبار هي نسخة كاملة من مستأجر الإنتاج الخاص بك، متاحة على عنوان URL منفصل. استخدمها لاختبار تغييرات الإعداد وتكاملات SSO ونقاط نهاية خطافات الويب دون التأثير على المستخدمين الفعليين.

الإجراءالوصف
تفعيل بيئة الاختبارينشئ نسخة بيئة اختبار من مستأجر الإنتاج الخاص بك. عنوان URL لبيئة الاختبار هو سلَج المستأجر مع اللاحقة -sandbox.
تحديث من البيئة الفعليةيزامن بيئة الاختبار مع إعدادات الإنتاج وبيانات المستخدمين الحالية.
تعطيل بيئة الاختباريحذف بيئة الاختبار وجميع بياناتها نهائيًا.

يمكن الوصول إلى بيئة الاختبار على {slug}-sandbox.authagonal.io.

Sandbox settings showing enable/disable toggle, refresh from live button, and sandbox URL display

عناصر التحكم في بيئة الاختبار

الفوترة

أدِر اشتراكك وفوترتك عبر صفحة الفوترة في البوابة. تمنحك هذه الصفحة نظرة عامة على خطتك الحالية وتتيح لك الوصول إلى بوابة فوترة Stripe لإدارة طرق الدفع والفواتير وتغييرات الخطة.

معلومات الاشتراك

تعرض صفحة الفوترة تفاصيل اشتراكك الحالي بنظرة واحدة. سترى شارة حالة تشير إلى وضع اشتراكك (active أو trialing أو past_due أو canceled أو unpaid)، إلى جانب اسم خطتك وفترة الفوترة الحالية (تاريخا البدء والانتهاء) وما إذا كان اشتراكك مضبوطًا للإلغاء في نهاية الفترة الحالية.

إدارة الاشتراك

انقر فوق زر إدارة الاشتراك لفتح بوابة فوترة Stripe في نافذة جديدة. من هناك يمكنك تحديث طرق الدفع، وعرض الفواتير وتنزيلها، وتغيير خطتك، أو إلغاء اشتراكك.

إذا لم يكن هناك اشتراك بعد، يظهر بدلًا من ذلك زر دعوة لاتخاذ إجراء إعداد الفوترة، يرشدك خلال اختيار خطة وإدخال تفاصيل الدفع.

Billing page showing subscription status, plan name, billing period, and Manage Subscription button

تعرض صفحة الفوترة تفاصيل اشتراكك الحالي وتتيح الوصول إلى Stripe

أمان الدفع

تُدار جميع عمليات الفوترة عبر Stripe. لا تُخزَّن معلومات الدفع الخاصة بك أبدًا على خوادم Authagonal.

النطاقات المخصصة

قدّم صفحات المصادقة من نطاقك الخاص (مثل auth.yourdomain.com) بدلاً من النطاق الافتراضي {slug}.authagonal.io. تمنح النطاقات المخصصة مستخدميك تجربة مصادقة سلسة تحمل علامتك التجارية.

إضافة نطاق

أدخل اسم المضيف الذي تريد استخدامه في نموذج إضافة النطاق (مثل auth.yourdomain.com). بمجرد إضافته، سيظهر النطاق في قائمة نطاقاتك بحالة pending_verification.

التحقق عبر DNS

أنشئ سجل CNAME يوجّه نطاقك إلى {slug}.authagonal.io. بمجرد إضافة سجل DNS، انقر على تحقق للتأكد من انتشار DNS.

CNAME record
auth.yourdomain.com.  CNAME  acme.authagonal.io.

انتشار DNS

قد يستغرق انتشار DNS ما يصل إلى 48 ساعة. إذا فشل التحقق، انتظر وحاول مرة أخرى.

شهادات TLS

بمجرد التحقق من نطاقك، تحتاج إلى شهادة TLS كي يتمكن المستخدمون من الاتصال بأمان عبر HTTPS. يدعم Authagonal خيارين:

تلقائي (cert-manager) يوفّر Authagonal شهادات TLS ويجدّدها تلقائياً باستخدام cert-manager. هذا هو الخيار الموصى به لمعظم المستخدمين، ولا يتطلب أي إعداد إضافي.

أحضر شهادتك الخاصة (BYO) ارفع شهادتك ومفتاحك الخاص بصيغة PEM. هذا الخيار مفيد إذا كانت مؤسستك تتطلب شهادات من جهة إصدار شهادات محددة. ويتم تتبّع انتهاء صلاحية الشهادة كي تتمكن من تجديدها قبل انقضائها.

حالة النطاق

يعرض كل نطاق شارة حالة تشير إلى وضعه الحالي: pending_verification (لم يُؤكَّد DNS بعد)، أو verified (تم تأكيد DNS وما زال TLS قيد الانتظار)، أو active (يعمل بالكامل)، أو failed (تم اكتشاف مشكلة في الإعداد).

Domain list showing domains with status badges and verification controls

تعرض قائمة النطاقات كل نطاق مخصص وحالته الحالية

BYO certificate upload form with certificate and private key PEM fields

ارفع شهادة TLS ومفتاحك الخاص بصيغة PEM

تجديد شهادة BYO

حافظ على تجديد شهادة BYO الخاصة بك. ستتسبب الشهادات منتهية الصلاحية في ظهور تحذيرات أمان للمتصفح لمستخدميك.

إعداد البريد الإلكتروني

اضبط طريقة إرسال المستأجر الخاص بك للرسائل البريدية المعاملاتية، مثل التحقق وإعادة تعيين كلمة المرور وإشعارات MFA. اختر بين المرسِل المشترك الافتراضي، أو نطاق مخصص مُتحقَّق منه عبر Resend، أو خادم SMTP الخاص بك.

Email settings showing provider options (default, Resend domain, custom SMTP) and a test-send

الرسائل البريدية المترجَمة

تُرسَل الرسائل البريدية المعاملاتية بلغة المستلِم المفضّلة. تُصمَّم قوالب رسائل التحقق وإعادة تعيين كلمة المرور وتنبيه وجود الحساب والترحيب والفوترة ودعوة المسؤول بسبع لغات: الإنجليزية والألمانية والفرنسية والإسبانية والبرتغالية والفيتنامية والصينية المبسّطة. وعند عدم توفر قالب بلغة المستلِم، يعود البريد إلى الإنجليزية.

تُحدَّد اللغة من تفضيل المستلِم المخزَّن عند الإرسال. ويمكن أن يأتي هذا التفضيل من عدة مصادر:

  • التسجيل وإنشاء الحساب يُلتقط من اللغة التي اختارها المستخدم على شاشات تسجيل الدخول المُستضافة.
  • صفحة المستخدمين في البوابة يضبطها المسؤول عند إنشاء مستخدم أو تعديله.
  • التزويد عبر SCIM يُحدَّد من preferredLanguage الخاص بمزوّد الهوية عند مزامنة المستخدمين عبر SSO.
  • صفحة الحساب ذاتية الخدمة يختارها المستخدم بنفسه عبر /login/account.

لا حاجة إلى أي إعداد

الترجمة تلقائية وتنطبق على كل أوضاع المزوّدين (الافتراضي، ونطاق Resend المخصص، وSMTP). ولا يوجد ما يلزم تفعيله.

مزوّدو البريد الإلكتروني

المزوّدالوصفالإعداد
Defaultتُرسَل الرسائل من [email protected] باستخدام بنية Resend المشتركة لدينا.لا حاجة إلى أي إعداد، يعمل مباشرةً وبشكل جاهز.
Resend Custom Domainتُرسَل الرسائل من نطاقك الخاص المُتحقَّق منه عبر Resend.سجّل نطاقك، وأضف سجلات DNS، وتحقق من الملكية.
Custom SMTPتُرسَل الرسائل عبر خادم SMTP الخاص بك.قدّم مضيف SMTP والمنفذ وبيانات الاعتماد وإعدادات TLS.

هوية المرسِل

بريد المرسِل واسمه مشتركان عبر جميع أوضاع المزوّدين. بريد المرسِل مطلوب؛ ويعود اسم المرسِل إلى اسم المستأجر عند تركه فارغاً.

الحقلالوصف
senderEmailعنوان "من" في الرسائل الصادرة. يجب أن يكون على نطاق مُتحقَّق منه في وضع نطاق Resend المخصص.
senderNameالاسم المعروض في صندوق وارد المستلِم.

نطاق Resend المخصص

تحقق من نطاق الإرسال الخاص بك مع Resend مرة واحدة، ثم استخدمه كعنوان "من" لهذا المستأجر. تُوفَّر سجلات DNS من نوع TXT (SPF وDKIM) عبر صفحة النطاقات، ويتحقق منها Resend تلقائياً.

SMTP مخصص

أحضر خادم SMTP الخاص بك، وهو مفيد لعمليات الترحيل الداخلية، أو للمزوّدين غير المشمولين بـ Resend، أو للتثبيت التنظيمي.

الحقلالوصف
hostاسم مضيف خادم SMTP (مثل smtp.example.com).
portمنفذ الاتصال. 587 لـ STARTTLS، و465 لـ TLS الضمني، و25 لعمليات الترحيل الداخلية غير المصادَق عليها.
usernameاسم مستخدم المصادقة (اختياري، اتركه فارغاً لعمليات الترحيل غير المصادَق عليها).
passwordكلمة مرور المصادقة. تُخزَّن مشفّرة في سر إعدادات المستأجر.
useTlsاشترط TLS. اتركه مُفعَّلاً ما لم تكن تستهدف عملية ترحيل داخلية موثوقة.

نطاق إرسال مخصص

عند استخدام مزوّد Resend، يمكنك تسجيل نطاقك الخاص كي تصدر الرسائل من علامتك التجارية (مثل [email protected]) بدلاً من @authagonal.io.

  1. اذهب إلى الإعدادات ← البريد الإلكتروني واختر مزوّد Resend بنطاق مخصص.
  2. أدخل اسم نطاقك وانقر على تسجيل.
  3. أضف سجلات DNS المعروضة (DKIM وSPF ومسار الإرجاع) إلى DNS الخاص بنطاقك.
  4. انقر على التحقق من الإثبات، وبمجرد انتشار DNS (عادةً خلال 1 إلى 10 دقائق)، ستتغير حالة النطاق إلى مُتحقَّق منه.

انتشار DNS

قد تستغرق تغييرات DNS ما يصل إلى 48 ساعة لتنتشر عالمياً، وإن كان معظم المزوّدين يحدّثونها خلال دقائق. يمكنك التحقق من الإثبات بقدر ما تحتاج.

الاختبار

استخدم زر إرسال بريد اختباري في الإعدادات ← البريد الإلكتروني للتحقق من إعدادك. سيُرسَل بريد اختباري إلى عنوان بريد المسؤول الخاص بك باستخدام الإعدادات المحفوظة حالياً.

سجل التدقيق

يوفّر سجل التدقيق سجلاً للقراءة فقط لجميع الإجراءات الإدارية التي تُنفَّذ على المستأجر الخاص بك. يُلتقط كل تغيير يُجرى عبر البوابة أو API مع سياقه الكامل، ما يمنحك مساراً متكاملاً للامتثال واستكشاف الأخطاء وإصلاحها.

أعمدة السجل

العمودالوصف
الطابع الزمنيتاريخ ووقت وقوع الإجراء
المنفِّذعنوان البريد الإلكتروني للمسؤول الذي نفّذ الإجراء، أو "system" للإجراءات الآلية
الإجراءنوع الإجراء المنفَّذ (مثل: إنشاء عميل، تحديث الإعدادات)
الكيانهدف الإجراء بصيغة type:id (مثل: client:my-app)
التفاصيلسياق إضافي حول التغيير

الإجراءات المتتبَّعة

تُسجَّل الإجراءات الإدارية التالية في سجل التدقيق:

الفئةالإجراءات
العملاءإنشاء عميل، تحديث عميل، حذف عميل
اتصالات SSOإنشاء اتصال SAML، حذف اتصال SAML، إنشاء اتصال OIDC، حذف اتصال OIDC
المستخدمونإنشاء مستخدم، تحديث مستخدم
الإعداداتتحديث الإعدادات، تحديث العلامة التجارية
النطاقاتإضافة نطاق، التحقق من نطاق، حذف نطاق
SCIMإنشاء رمز SCIM، إبطال رمز SCIM
الأدوارإنشاء دور، تحديث دور، حذف دور
المجموعاتإنشاء مجموعة، حذف مجموعة
الفريقدعوة عضو فريق، إزالة عضو فريق
Audit log table showing timestamped administrative actions with actor, action, entity, and detail columns

يوفّر سجل التدقيق سجلاً متكاملاً لجميع الإجراءات الإدارية

الاحتفاظ

يُحتفظ بسجلات التدقيق طوال عمر المستأجر الخاص بك، ولا يمكن تعديلها أو حذفها.

النسخ الاحتياطي

ينشئ Authagonal نسخاً احتياطية من بيانات المستأجر الخاص بك تلقائياً وفق جدول يعمل كل ساعة. تشمل النسخ الاحتياطية جميع المستخدمين والمجموعات والأدوار والعملاء واتصالات SSO ورموز SCIM والعلامة التجارية والإعدادات. ويمكنك عرض سجل النسخ الاحتياطي وتنزيل أحدث نسخة احتياطية كاملة من صفحة النسخ الاحتياطي.

Backups page showing backup history with timestamps, types, and entity counts

كيف يعمل النسخ الاحتياطي

  • تُجرى نسخة احتياطية كاملة مرة واحدة يومياً، تلتقط كل جدول في جزء التخزين الخاص بالمستأجر لديك.
  • تُجرى النسخ الاحتياطية التزايدية كل ساعة، وتلتقط فقط الصفوف التي تغيّرت منذ آخر نسخة احتياطية.
  • تُخزَّن النسخ الاحتياطية في Azure Blob Storage بالهوية المُدارة نفسها التي يستخدمها المستأجر الخاص بك.
  • تُتتبَّع السجلات المحذوفة عبر علامات الحذف وتُدرَج في النسخ الاحتياطية اكتمالاً للتدقيق.

تنزيل النسخ الاحتياطية

انقر على تنزيل الأحدث للحصول على ملف ZIP يحتوي على أحدث نسخة احتياطية كاملة مدمجة مع جميع النسخ الاحتياطية التزايدية اللاحقة. يُصدَّر كل جدول كملف JSONL (كائن JSON واحد لكل سطر).

صيغة النسخ الاحتياطي

تُصدَّر النسخ الاحتياطية بصيغة JSONL (سطور JSON)، أي كيان واحد لكل سطر لكل جدول. هذه الصيغة سهلة التحليل والمقارنة والاستيراد إلى أنظمة أخرى.

تطبيقات التزويد

تتلقى تطبيقات التزويد إشعارات خطاف الويب (webhook) في الوقت الفعلي عند إنشاء المستخدمين أو مصادقتهم في المستأجر الخاص بك. يتيح هذا للأنظمة اللاحقة إعداد الحسابات تلقائياً، أو تعيين التراخيص، أو مزامنة بيانات المستخدمين دون تدخل يدوي.

كيف يعمل

عند وقوع حدث متعلق بمستخدم (إنشاء أو مصادقة)، يستدعي Authagonal عنوان رد النداء (callback URL) الخاص بتطبيق التزويد لديك باستخدام نمط TCC (محاولة/تأكيد/إلغاء). يضمن هذا النهج ثلاثي المراحل تزويداً موثوقاً عبر عدة أنظمة لاحقة:

المرحلةنقطة النهايةالغرض
/tryPOST {callbackUrl}/tryيتحقق مما إذا كان بإمكان التطبيق التعامل مع المستخدم. أعِد 200 للقبول أو 4xx للرفض.
/confirmPOST {callbackUrl}/confirmيثبّت العملية بعد أن تكون جميع التطبيقات قد قبلت مرحلة /try.
/cancelPOST {callbackUrl}/cancelيتراجع عن العملية إذا فشل تطبيق آخر أثناء مرحلة /try.

حمولة خطاف الويب

يتضمن كل طلب خطاف ويب حمولة JSON تحتوي على الحقول التالية:

الحقلالنوعالوصف
eventstringنوع الحدث (مثل: user.created، user.authenticated)
userIdstringالمعرّف الفريد للمستخدم
emailstringعنوان البريد الإلكتروني للمستخدم
namestringالاسم المعروض للمستخدم
tenantIdstringمعرّف المستأجر الخاص بك
timestampstringطابع زمني بصيغة ISO 8601 للحدث

إضافة تطبيق تزويد

لإضافة تطبيق تزويد، قدّم اسماً وعنوان رد نداء (callback URL) ومفتاح API اختيارياً. يُرسَل مفتاح API كرمز Bearer في ترويسة Authorization لكل طلب خطاف ويب، ما يتيح لتطبيقك مصادقة الطلبات الواردة من Authagonal.

الاختبار

انقر على اختبار بجوار أي تطبيق تزويد لإرسال طلب اختباري إلى عنوان رد النداء الخاص بك. تعرض نتائج الاختبار رمز حالة HTTP ومحتوى الاستجابة، ما يساعدك على التأكد من أن تطبيقك يستقبل خطافات الويب ويعالجها بشكل صحيح.

Provisioning apps page showing configured apps with test results displaying HTTP status and response body

اختبر تطبيقات التزويد للتحقق من تسليم خطاف الويب ومعالجة الاستجابة

حدود الخطة

يمكن ضبط الحد الأقصى لعدد تطبيقات التزويد لكل مستأجر، بحد افتراضي قدره 6. ويمكن للمسؤول تعديل هذا الحد إذا كان سير عملك يتطلب أهداف تزويد إضافية.

مصادقة مفتاح API

إذا تم تعيين مفتاح API، فإنه يُرسَل كرمز Bearer في ترويسة Authorization. استخدمه لمصادقة طلبات خطاف الويب الواردة من Authagonal.

الفريق

تدير صفحة الفريق مسؤولي البوابة، وهم الأشخاص الذين يمكنهم الوصول إلى المستأجر الخاص بك وإعداده عبر بوابة الإدارة. يتمتع جميع أعضاء الفريق بصلاحية إدارية كاملة على كل جانب من جوانب إعداد المستأجر لديك.

قائمة المسؤولين

تعرض قائمة المسؤولين اسم كل عضو في الفريق وعنوان بريده الإلكتروني وتاريخ إضافته. ويظهر مؤشر "أنت" بجوار صف المستخدم الحالي كي يسهل عليك تمييز حسابك الخاص.

دعوة المسؤولين

لدعوة عضو جديد في الفريق، قدّم عنوان بريده الإلكتروني واسمه وكلمة مرور مؤقتة (8 أحرف كحد أدنى). يسجّل المستخدم المدعوّ الدخول بكلمة المرور المؤقتة، وينبغي له تغييرها عند أول تسجيل دخول.

حقول الدعوة

تُنشئ دعوات المسؤولين مستخدماً مُزوَّداً بالكامل، دون حاجة إلى تبادل رسائل بريدية.

الحقلالوصف
emailعنوان البريد الإلكتروني للمسؤول الجديد. يجب أن يكون فريداً ضمن المستأجر.
nameالاسم المعروض في قائمة المسؤولين.
tempPasswordكلمة المرور المؤقتة التي يستخدمها المدعوّ عند أول تسجيل دخول. سيُطلب منه تغييرها. اتركها فارغة لإنشائها تلقائياً وإرسالها عبر البريد الإلكتروني.

إزالة المسؤولين

انقر على إزالة بجوار أي عضو في الفريق لإلغاء صلاحية وصوله. يظهر مربع حوار للتأكيد قبل إتمام الإزالة. ولا يمكنك إزالة نفسك، إذ يجب أن يبقى مسؤول واحد على الأقل في الفريق دائماً.

Team page showing the admin list with name, email, date added columns, a You indicator, and invite/remove controls

إدارة مسؤولي البوابة من صفحة الفريق

لا يوجد دور مالك

لا يوجد تمييز لدور "المالك". يتمتع جميع مسؤولي البوابة بصلاحية كاملة على إعداد المستأجر. فكن حذراً ممن تدعوه.

الدعم

افتح تذكرة دعم مع فريق Authagonal دون مغادرة البوابة. كل تذكرة هي محادثة مترابطة، كي تبقى أنت وفريقنا على الصفحة نفسها من أول إبلاغ حتى الحل.

تذاكرك

تعرض صفحة الدعم كل تذكرة طرحتها، مع ترتيب الأحدث نشاطاً أولاً. استخدم شارة الحالة لترى بلمحة ما الذي ينتظر ردك وما الذي ينتظر ردنا.

Support ticket list showing each ticket's subject, status badge, priority, and last-activity time, with a New ticket button

تذاكر الدعم الخاصة بك مع الموضوع والحالة والأولوية وآخر نشاط

  • يعرض كل صف الموضوع والحالة الحالية (مفتوحة، أو قيد الانتظار، أو محلولة، أو مغلقة) والأولوية ووقت آخر نشاط.
  • انقر على تذكرة جديدة لفتح واحدة، ثم امنحها موضوعاً وأولوية ورسالتك الأولى.
  • تسهّل شارات الحالة المُرمَّزة بالألوان مسح القائمة بحثاً عن التذاكر التي تحتاج إلى انتباهك.

سلسلة التذكرة

يعرض فتح التذكرة المحادثة كاملةً. تُنشَر الردود بالترتيب، وتظهر الرسائل الجديدة من فريقنا دون إعادة تحميل الصفحة.

Support ticket thread showing the conversation between the customer and the Authagonal team with a reply box and file attachment control

سلسلة تذكرة بينك وبين فريق Authagonal

  • تُعرَض الرسائل المترابطة بينك وبين فريق Authagonal بترتيب زمني.
  • رُدّ ضمن السلسلة وأرفق ملفات لمشاركة السجلات أو لقطات الشاشة أو الإعدادات.
  • تتحدّث السلسلة مباشرةً، فيظهر رد فريقنا فور إرساله.
  • وإذا رددت على بريد الإشعار بدلاً من ذلك، تُدرَج رسالتك في السلسلة تلقائياً.

كيف تصلك الردود

يعمل موظفو Authagonal على التذاكر من جانب الإدارة. تُشعَر عبر البريد الإلكتروني كلما رد الفريق، فلا حاجة إلى إبقاء البوابة مفتوحة للبقاء على اطلاع بالمحادثة.

الاستيراد والترحيل

رحّل نظام هوية قائماً إلى مستأجر Authagonal الخاص بك. يُدعم مصدران، Duende IdentityServer (قاعدة بيانات SQL Server) وAuth0 (Management API). ويُجري كلٌّ منهما معاينة للقراءة فقط لتراجع بدقة ما الذي سيُنسخ قبل الالتزام.

الاستيراد من Duende IdentityServer

رحّل العملاء والنطاقات والمستخدمين والأدوار من قاعدة بيانات SQL Server قائمة لـ Duende IdentityServer إلى مستأجر Authagonal الخاص بك. يُجرى الاستيراد على مرحلتين، المعاينة ثم الالتزام، بحيث يمكنك مراجعة ما سيُنسخ قبل إجراء أي تغييرات.

ما الذي يُستورد

يقرأ أداة الاستيراد من جدول ConfigurationDb الخاص بـ Duende ومن جداول ASP.NET Identity، ويكتب الصفوف المُطابَقة في مستأجرك. أما العناصر قصيرة العمر مثل المنح المُخزّنة ورموز الأجهزة ومفاتيح التوقيع فيُتجاوز عنها.

الكيانالجداول المصدرملاحظات
العملاءClients, ClientSecrets, ClientGrantTypes, ClientScopes, ClientRedirectUrisتُستورد العملاء المعطّلون بحالة معطّلة. ويُتجاوز عن الأسرار المنتهية الصلاحية.
النطاقاتApiScopes, ApiResources, IdentityResourcesتُحفظ تعيينات مطالبات المستخدم حيثما أمكن التعرّف عليها.
المستخدمونAspNetUsers, AspNetUserClaimsتُنسخ تجزئات كلمات المرور (ASP.NET Identity V3) كما هي وتُعاد تجزئتها عند أول تسجيل دخول.
الأدوارAspNetRoles, AspNetUserRolesتُحفظ إسنادات الأدوار.
تسجيلات الدخول الخارجيةAspNetUserLoginsتُخزَّن للرجوع إليها؛ أعد ربط موفّري الهوية الأصليين عبر SSO بعد الاستيراد.

المعاينة قبل الالتزام

الصق سلسلة اتصال ConfigurationDb / IdentityDb الخاصة بـ Duende ثم انقر تشغيل المعاينة. تفتح المعاينة اتصالاً للقراءة فقط وتُحصي كل صف سيُستورَد، دون حدوث أي عمليات كتابة.

  • أعداد الكيانات للعملاء والنطاقات والمستخدمين والأدوار وإسنادات الأدوار.
  • تحذيرات الكتابة فوق البيانات عندما يحتوي المستأجر الهدف بالفعل على عملاء أو أدوار أو نطاقات مطابقة.
  • تحذيرات حول الجداول غير المعروفة والأعمدة غير المُطابَقة لتعرف ما الذي سيُسقَط.
Import preview panel showing entity counts and warnings before committing the import

لوحة المعاينة مع الأعداد والتحذيرات

تجزئات كلمات المرور

يخزّن Duende كلمات المرور باستخدام ASP.NET Identity V3 (PBKDF2). يتحقق PasswordHasher الخاص بـ Authagonal من هذا التنسيق مباشرةً ويعيد تجزئته إلى التنسيق الأصلي عند أول تسجيل دخول ناجح، فيحتفظ المستخدمون بكلمات مرورهم الحالية دون الحاجة إلى عملية إعادة تعيين.

التوفيق بين معرّفات المستخدمين

إذا كان لدى مستخدم موجود بالفعل في هذا المستأجر نفس البريد الإلكتروني لسجلّ وارد، فإن الاستيراد يُدوّر قيمة userId الخاصة بذلك الحساب إلى sub المصدر قبل الاستيراد، بحيث تُرفَق الأدوار وعمليات تسجيل الدخول والمطالبات المستوردة بالحساب الموجود، وتستمر التطبيقات التي تشير إلى المستخدم بالفعل عبر sub المصدر الخاص به في العمل بعد التحويل. تُحفَظ كلمة المرور والملف الشخصي الحاليان للحساب؛ وتُدمج أدوار المصدر فوقها. تسرد المعاينة كل حساب سيجري التوفيق بشأنه قبل الالتزام.

تشغيل الاستيراد

انقر بدء الاستيراد بعد مراجعة المعاينة. تكتب مرحلة الالتزام العملاء والنطاقات والمستخدمين والأدوار ومراجع تسجيلات الدخول الخارجية في مخازن مستأجرك. ويُتجاوز عن الصفوف المكرّرة في clientId وscope name وemail وrole name، فأداة الاستيراد آمنة لإعادة التشغيل.

ما الذي لا يُستورد

  • المنح المُخزّنة ورموز الأجهزة والجلسات على جانب الخادم، عناصر قصيرة العمر تُعاد إنشاؤها تلقائياً.
  • مفاتيح التوقيع، يُصدر Authagonal مفاتيحه الخاصة لكل مستأجر.
  • الأعمدة والجداول المخصصة، أي شيء خارج المخطط القياسي لـ Duende يظهر كتحذير لتعرف أن البيانات قد أُسقطت.
  • العملاء المعطّلون، يُستوردون بحالة معطّلة؛ أعد تفعيلهم من صفحة العملاء عند الاستعداد.

غير متاح في بيئة الاختبار

يُجرى الاستيراد على المستأجر المباشر فقط. اخرج من وضع بيئة الاختبار قبل الاستيراد.

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

اربط Authagonal بـ Management API الخاص بمستأجر Auth0 لديك وانقل تطبيقاتك وواجهات API والأدوار والمستخدمين واتصالات المؤسسات. تُحفظ معرّفات المستخدمين والتطبيقات المستوردة، فتظل مراجع sub وclient_id الحالية قابلة للحلّ بعد التحويل.

ما الذي ستحتاج إليه

أنشئ تطبيق Machine-to-Machine في Auth0 مصرّحاً له باستخدام Management API، مع منحه نطاقات القراءة هذه: read:users، read:clients، read:resource_servers، read:roles، read:connections، read:client_grants. الصق نطاقه ومعرّف العميل وسرّ العميل في نموذج الاستيراد، فهي تُستخدم للاستيراد فقط.

ما الذي يُستورد

الكيانالجداول المصدرملاحظات
التطبيقاتclients, client-grantsيُكتشف نوع العميل (عام أم سرّي) تلقائياً. وتُعاد تجزئة أسرار العملاء كي تستمر في العمل.
واجهات API والنطاقاتresource-serversتُسنَد الجماهير (audiences) والنطاقات إلى كل عميل انطلاقاً من منحه.
الأدوارroles + assignmentsتُحفظ إسنادات الأدوار لكل مستخدم.
المستخدمونusers + identitiesتُنقل الملفات الشخصية والبيانات الوصفية؛ وتصبح الهويات الاجتماعية والمؤسسية تسجيلات دخول مرتبطة.
الاتصالاتconnections (OIDC)تصبح اتصالات OIDC المؤسسية موفّرين فيدراليين. أما اتصالات SAML والاجتماعية وقواعد البيانات فيُتجاوز عنها مع تحذير.

كلمات المرور

لا يُعيد Management API الخاص بـ Auth0 تجزئات كلمات المرور أبداً. إذا كان لديك تصدير كلمات المرور المجمّع المدعوم من فريق Auth0 (NDJSON)، فقدّمه، إذ تُستورد تجزئات bcrypt كما هي ويحتفظ مستخدموك بكلمات مرورهم دون إعادة تعيين. كما يحمل ذلك الملف مجموعة مستخدميك الكاملة، متجاوزاً حدّ سرد 1000 مستخدم في واجهة API لدى Auth0. وبدونه، يُستورد المستخدمون كملفات شخصية ويضبطون كلمة مرور جديدة عند أول تسجيل دخول.

المعاينة والتدوير والحدود نفسها

المعاينة وتدوير userId للمالك والالتزام القابل لإعادة التشغيل وقيد بيئة الاختبار الموضّحة أعلاه تنطبق على عمليات استيراد Auth0 أيضاً.

مرجع API

يوفّر كل مستأجر خادم OIDC متوافقًا مع المعايير على https://{slug}.authagonal.io. تتبع جميع نقاط النهاية مواصفات OAuth 2.0 وOpenID Connect. يغطّي هذا المرجع كل نقطة نهاية قد يحتاج تطبيقك إلى التفاعل معها.

OIDC Authorization Code Flow with PKCE — sequence diagram showing the 9-step flow between your app, the browser, and Authagonal

تدفّق رمز التفويض مع PKCE

اكتشاف OIDC وJWKS

يتيح مستند الاكتشاف لمكتبات عميل OIDC ضبط نفسها تلقائيًا. لا حاجة إلى أي مصادقة لأيٍّ من نقطتي النهاية.

GET /.well-known/openid-configuration

تُعيد مستند تكوين موفّر OpenID. تتضمّن الاستجابة كل البيانات الوصفية التي يحتاجها عميلك للتفاعل مع هذا المستأجر.

الحقلالوصف
issuerعنوان URL لمُصدِر المستأجر
authorization_endpointعنوان URL لطلبات التفويض
token_endpointعنوان URL لتبادل الرموز
userinfo_endpointعنوان URL لجلب مطالبات المستخدم
jwks_uriعنوان URL لمجموعة مفاتيح الويب JSON
revocation_endpointعنوان URL لإبطال الرموز
introspection_endpointعنوان URL لفحص الرموز
end_session_endpointعنوان URL لتسجيل الخروج / إنهاء الجلسة
device_authorization_endpointعنوان URL لطلبات تفويض الأجهزة
pushed_authorization_request_endpointعنوان URL لنقطة نهاية طلب التفويض المدفوع (PAR) (RFC 9126).
require_pushed_authorization_requestsما إذا كان المستأجر يتطلّب PAR على نطاق عام. حتى عندما تكون هذه القيمة false، لا يزال بإمكان العملاء الأفراد ضبط RequirePushedAuthorizationRequests = true.
scopes_supportedقائمة النطاقات المدعومة
response_types_supportedأنواع الاستجابة المدعومة
grant_types_supportedأنواع المنح المدعومة
code_challenge_methods_supportedأساليب PKCE المدعومة (S256)
backchannel_logout_supportedما إذا كان تسجيل الخروج عبر القناة الخلفية مدعومًا

GET /.well-known/openid-configuration/jwks

تُعيد مجموعة مفاتيح الويب JSON المستخدَمة للتحقق من تواقيع الرموز. تحتوي الاستجابة على مصفوفة keys تضم مفاتيح RSA العامة، يتضمّن كل منها الحقول kty وuse وkid وalg وn وe.

Fetch discovery document
curl https://acme.authagonal.io/.well-known/openid-configuration

نقطة نهاية التفويض

GET /connect/authorize

تبدأ تدفّق رمز التفويض. يجب أن تكون لدى المستخدم جلسة نشطة وإلا فسيُعاد توجيهه إلى صفحة تسجيل الدخول. عند النجاح، يُعاد توجيه المستخدم إلى تطبيقك مزوّدًا برمز تفويض.

المعاملمطلوبالوصف
response_typeنعميجب أن يكون "code"
client_idنعممُعرّف العميل المسجّل الخاص بك
redirect_uriنعميجب أن يطابق تمامًا عنوان إعادة توجيه URI مسجّلًا
scopeنعمقائمة بالنطاقات مفصولة بمسافات (مثل "openid profile email")
stateموصى بهقيمة مبهمة لحماية CSRF، تُعاد دون تغيير في إعادة التوجيه
code_challengeمطلوب في حال استخدام PKCEتجزئة SHA-256 المُرمّزة بترميز Base64url لقيمة code_verifier
code_challenge_methodمطلوب في حال استخدام PKCEيجب أن يكون "S256"
nonceاختياريقيمة مرتبطة برمز الهوية للحماية من إعادة التشغيل
login_hintاختياريملء حقل البريد الإلكتروني مسبقًا في صفحة تسجيل الدخول

استجابة النجاح: إعادة توجيه 302 إلى redirect_uri مع معاملي الاستعلام code وstate.

استجابة الخطأ: إعادة توجيه 302 مع معاملات الاستعلام error وerror_description وstate.

PKCE مطلوب

إن PKCE مطلوب افتراضيًا لجميع العملاء. أنشئ قيمة code_verifier (سلسلة عشوائية من 43 حرفًا أو أكثر)، وجزّئها باستخدام SHA-256، ثم رمّز النتيجة بترميز Base64url لإنشاء قيمة code_challenge.

طلبات التفويض المدفوعة (PAR)

RFC 9126. بدلًا من وضع كل معاملات التفويض على عنوان URL، يرسل عميلك طلب POST بها إلى /connect/par مع مصادقة العميل المعتادة ويستردّ قيمة request_uri مبهمة قصيرة العمر. ثم يزور المتصفّح /connect/authorize?client_id=...&request_uri=...، فلا يصل أي شيء آخر إلى سجل المتصفّح أو سجلات الخادم أو ترويسات Referer، ويكون الخادم قد تحقّق بالفعل من سلامة المعاملات تحت مصادقة العميل.

POST /connect/par

مصادقة العميل هي نفسها المستخدَمة في /connect/token: مصادقة HTTP الأساسية باستخدام client_id/client_secret، أو بيانات اعتماد مُرمّزة في النموذج. ينشر العملاء العامون دون كلمة سر. يحمل النص نفس المعاملات التي ترسلها عادةً إلى /connect/authorize؛ أما request_uri نفسها فمرفوضة (تسلسل PAR محظور بموجب §2.1 من المواصفة). تُعيد 201 Created.

المعاملمطلوبالوصف
client_idنعممُعرّف العميل الخاص بك. يجب أن يطابق العميل المُصادَق عليه.
client_secretالعملاء السرّيونكلمة سر العميل الخاصة بك. مطلوبة للعملاء السرّيين.
response_typeنعميجب أن يكون "code"
redirect_uriنعميجب أن يطابق تمامًا عنوان إعادة توجيه URI مسجّلًا
scopeنعمقائمة بالنطاقات مفصولة بمسافات (مثل "openid profile email")
code_challengeمطلوب في حال استخدام PKCEتجزئة SHA-256 المُرمّزة بترميز Base64url لقيمة code_verifier
code_challenge_methodمطلوب في حال استخدام PKCEيجب أن يكون "S256"
stateموصى بهقيمة مبهمة لحماية CSRF، تُعاد دون تغيير في إعادة التوجيه
nonceاختياريقيمة مرتبطة برمز الهوية للحماية من إعادة التشغيل

الاستجابة

الحقلالوصف
request_uriمرجع مبهم يُستخدَم لمرة واحدة، مثل <code>urn:ietf:params:oauth:request_uri:abc123…</code>. مرّره إلى <code>/connect/authorize</code> بصفته <code>request_uri</code>.
expires_inعمر قيمة <code>request_uri</code> بالثواني. القيمة الافتراضية هي 90، وهي قيمة نموذجية لموفّري الهوية المرجعيين.

في طلب المتابعة GET /connect/authorize?client_id=…&request_uri=…، تُسحَب جميع المعاملات الأخرى من الحمولة المدفوعة ويُتجاهَل أي معاملات استعلام إضافية. يجب أن يطابق client_id في استدعاء التفويض العميل الذي دفع الطلب. وبمجرد استهلاك قيمة request_uri (أو انقضاء expires_in)، تُزال من المخزن.

فرض PAR لكل عميل

فعّل خيار اشتراط PAR على عميل (البوابة ← العملاء ← العميل ← الإعدادات المتقدمة) لرفض استدعاءات /connect/authorize العادية منه. يجمع الوضع الموصى به للعملاء عالي المخاطر بين RequirePushedAuthorizationRequests = true وPKCE، وهو ما يزيل شريط عناوين URL بصفته سطح هجوم بالكامل.
Push an authorization request and follow up
# 1. Push parameters (server returns request_uri + expires_in)
curl -X POST https://acme.authagonal.io/connect/par \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "response_type=code" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "scope=openid profile email" \
  -d "state=$(openssl rand -hex 16)" \
  -d "code_challenge=YOUR_CODE_CHALLENGE" \
  -d "code_challenge_method=S256"

# 2. Send the user to /authorize with only client_id + request_uri
# https://acme.authagonal.io/connect/authorize?client_id=my-app&request_uri=urn:ietf:params:oauth:request_uri:abc123...

نقطة نهاية الرموز

POST /connect/token

تبادل بيانات الاعتماد بالرموز. يجب أن تستخدم الطلبات Content-Type: application/x-www-form-urlencoded. يمكن توفير مصادقة العميل عبر مصادقة HTTP الأساسية (Authorization: Basic base64(client_id:client_secret)) أو بصفتها معاملات في نص النموذج (client_id + client_secret).

منح رمز التفويض

المعاملمطلوبالوصف
grant_typeنعم"authorization_code"
codeنعمرمز التفويض المأخوذ من إعادة التوجيه
redirect_uriنعميجب أن يطابق عنوان URI المستخدَم في طلب التفويض
code_verifierمطلوب في حال استخدام PKCEالسلسلة العشوائية الأصلية المستخدَمة لإنشاء code_challenge
client_idنعممُعرّف العميل الخاص بك (إن لم تكن تستخدم مصادقة Basic)
client_secretالعملاء السرّيونكلمة سر العميل الخاصة بك (إن لم تكن تستخدم مصادقة Basic)

منح رمز التحديث

المعاملمطلوبالوصف
grant_typeنعم"refresh_token"
refresh_tokenنعمرمز التحديث المراد تبادله
client_idنعممُعرّف العميل الخاص بك
client_secretالعملاء السرّيونكلمة سر العميل الخاصة بك

منح بيانات اعتماد العميل

المعاملمطلوبالوصف
grant_typeنعم"client_credentials"
client_idنعممُعرّف العميل الخاص بك
client_secretنعمكلمة سر العميل الخاصة بك
scopeاختياريالنطاقات المطلوبة مفصولة بمسافات

منح رمز الجهاز

المعاملمطلوبالوصف
grant_typeنعم"urn:ietf:params:oauth:grant-type:device_code"
device_codeنعمرمز الجهاز المأخوذ من استجابة تفويض الجهاز
client_idنعممُعرّف العميل الخاص بك
client_secretالعملاء السرّيونكلمة سر العميل الخاصة بك

استجابة الرمز:

الحقلالوصف
access_tokenرمز الوصول لاستدعاءات API
token_type"Bearer"
expires_inعمر الرمز بالثواني
id_tokenرمز هوية OpenID Connect (عند طلب نطاق openid)
refresh_tokenرمز التحديث (عند منح نطاق offline_access)
Exchange authorization code with PKCE
curl -X POST https://acme.authagonal.io/connect/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://app.example.com/callback" \
  -d "client_id=my-app" \
  -d "code_verifier=YOUR_CODE_VERIFIER"

نقطة نهاية UserInfo

GET /connect/userinfo

تُعيد مطالبات حول المستخدم المُصادَق عليه. تتطلّب رمز وصول صالحًا يحمل نطاق openid.

الحقلالنوعالوصف
substringمُعرّف المستخدم الفريد
emailstringعنوان البريد الإلكتروني للمستخدم
email_verifiedbooleanما إذا كان البريد الإلكتروني قد تم التحقق منه
given_namestringالاسم الأول
family_namestringاسم العائلة
namestringالاسم الكامل المعروض
phone_numberstringرقم الهاتف (إن تم توفيره)
org_idstringمُعرّف المؤسسة
rolesstring[]مصفوفة الأدوار المُسنَدة
groupsobject[]مصفوفة عضويات المجموعات، يحمل كل عنصر منها مُعرّفًا واسمًا
Fetch user info
curl https://acme.authagonal.io/connect/userinfo \
  -H "Authorization: Bearer ACCESS_TOKEN"

فحص الرموز (RFC 7662)

POST /connect/introspect

يتحقّق من رمز ويعيد بياناته الوصفية. يتطلّب بيانات اعتماد العميل (مصادقة Basic أو معاملات في نص النموذج).

المعاملمطلوبالوصف
tokenنعمالرمز المراد فحصه
token_type_hintاختياريتلميح حول نوع الرمز (مثل "refresh_token")

استجابة الرمز النشط:

الحقلالوصف
activetrue
subالموضوع (مُعرّف المستخدم)
client_idالعميل الذي أُصدِر له الرمز
scopeالنطاقات الممنوحة مفصولة بمسافات
issالمُصدِر
expوقت انتهاء الصلاحية (طابع زمني Unix)
iatوقت الإصدار (طابع زمني Unix)
audالجمهور
token_typeنوع الرمز (مثل "Bearer")

استجابة الرمز غير النشط: { "active": false }

دائمًا 200 OK

وفقًا لـ RFC 7662، تُعيد نقطة نهاية الفحص دائمًا 200 OK، ولا تُعيد أبدًا 401 أو 403. يمنع هذا هجمات تعداد الرموز. فالرمز غير الصالح أو منتهي الصلاحية يُعيد ببساطة active: false.
Introspect a token
curl -X POST https://acme.authagonal.io/connect/introspect \
  -u "my-app:CLIENT_SECRET" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "token=ACCESS_OR_REFRESH_TOKEN"

إبطال الرموز (RFC 7009)

POST /connect/revocation

يُبطل رمزًا أُصدِر مسبقًا. يتطلّب بيانات اعتماد العميل.

المعاملمطلوبالوصف
tokenنعمالرمز المراد إبطاله
token_type_hintاختياريتلميح حول نوع الرمز (مثل "refresh_token")

تُعيد نقطة النهاية دائمًا 200 OK، حتى للرموز غير الصالحة أو المُبطَلة بالفعل، وفقًا لمواصفة RFC 7009.

رموز التحديث فقط

يدعم حاليًا إبطال رموز التحديث. أما رموز الوصول فهي JWT عديمة الحالة ولا يمكن إبطالها، إذ تبقى صالحة حتى تنتهي صلاحيتها طبيعيًا.

تفويض الأجهزة (RFC 8628)

POST /connect/deviceauthorization

يبدأ تدفّق تفويض الأجهزة للأجهزة محدودة الإدخال (واجهات سطر الأوامر، وأجهزة التلفاز الذكية، وأجهزة إنترنت الأشياء). يعرض الجهاز رمزًا للمستخدم الذي يوافق بعد ذلك على الطلب على جهاز منفصل مزوّد بمتصفّح.

المعاملمطلوبالوصف
client_idنعممُعرّف العميل الخاص بك
client_secretالعملاء السرّيونكلمة سر العميل الخاصة بك
scopeاختياريالنطاقات مفصولة بمسافات (القيمة الافتراضية "openid")

الاستجابة:

الحقلالوصف
device_codeرمز التحقق من الجهاز (يُستخدَم للاستعلام المتكرّر)
user_codeالرمز المعروض للمستخدم بصيغة XXXX-XXXX
verification_uriعنوان URL الذي يزوره المستخدم لإدخال الرمز
verification_uri_completeعنوان URL مع ملء user_code مسبقًا
expires_in600 (بالثواني، الرمز صالح لمدة 10 دقائق)
interval5 (بالثواني، الحد الأدنى لفترة الاستعلام المتكرّر)

تدفّق الموافقة: يزور المستخدم verification_uri، ويُدخل user_code، ويوافق على الطلب. وفي غضون ذلك، يستعلم الجهاز من نقطة نهاية الرموز باستخدام device_code.

رموز أخطاء الاستعلام المتكرّر:

الخطأالمعنى
authorization_pendingلم يوافق المستخدم بعد، تابع الاستعلام
expired_tokenانتهت صلاحية رمز الجهاز، أعد بدء التدفّق
access_deniedرفض المستخدم طلب التفويض
Request device authorization
curl -X POST https://acme.authagonal.io/connect/deviceauthorization \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=my-cli" \
  -d "scope=openid profile email"

إنهاء الجلسة / تسجيل الخروج

GET POST /connect/endsession

يسجّل خروج جلسة المستخدم الحالية، ويطلق تسجيل الخروج عبر القناة الخلفية لجميع العملاء الذين لديهم BackChannelLogoutUri مسجّل، ويُبطل جميع المنح.

المعاملمطلوبالوصف
id_token_hintاختياريرمز الهوية، يُستخدَم للتحقق من post_logout_redirect_uri
post_logout_redirect_uriاختياريوجهة إعادة التوجيه بعد تسجيل الخروج (يجب أن تكون مسجّلة)
stateاختياريقيمة مبهمة تُعاد في إعادة التوجيه

إذا تم توفير قيمة post_logout_redirect_uri صالحة وطابقت عنوان URI مسجّلًا، فسيتلقّى المستخدم إعادة توجيه 302. وإلا فستؤكّد استجابة JSON أن الجلسة قد أُنهيت.

تسجيل الخروج عبر القناة الخلفية

عندما يسجّل مستخدم خروجه، يرسل Authagonal رمز JWT موقّعًا إلى BackChannelLogoutUri الخاص بكل عميل. يحتوي رمز JWT على sub وaud وiss ومطالبة الحدث http://schemas.openid.net/event/backchannel-logout. وينبغي لتطبيقك إبطال جلسة المستخدم المحلية عند تلقّي هذا الإشعار.

مرجع API لـ SCIM 2.0

يدعم Authagonal بروتوكول SCIM 2.0 لتزويد المستخدمين والمجموعات تلقائيًا. ويمكن لموفّري الهوية مثل Okta وAzure AD وOneLogin استخدام هذا الـ API للحفاظ على مزامنة مستأجر Authagonal الخاص بك مع دليل شركتك.

عنوان URL الأساسي: https://{slug}.authagonal.io/scim/v2

المصادقة: تتطلّب جميع الطلبات رمز Bearer. أنشئ رمز SCIM في البوابة ضمن الإعدادات > تزويد SCIM.

الترويسات الشائعة:

الترويسةالقيمة
AuthorizationBearer SCIM_TOKEN
Content-Typeapplication/scim+json

تدعم نقاط نهاية القوائم التقسيم إلى صفحات عبر معاملي الاستعلام startIndex (يبدأ من 1) وcount (بحد أقصى 200)، والتصفية عبر معامل filter (مثل userName eq "[email protected]").

المستخدمون

GET /scim/v2/Users — سرد المستخدمين مع تقسيم اختياري إلى صفحات وتصفية.

معامل الاستعلامالوصف
startIndexفهرس النتيجة الأولى يبدأ من 1 (القيمة الافتراضية: 1)
countالعدد الأقصى للنتائج في كل صفحة (بحد أقصى: 200)
filterتعبير تصفية SCIM (مثل userName eq "[email protected]")

GET /scim/v2/Users/{id} — الحصول على مستخدم واحد عبر مُعرّف مستخدم Authagonal الخاص به.

POST /scim/v2/Users — إنشاء مستخدم جديد. تُعيد 201 Created.

الحقلمطلوبالوصف
userNameنعمعنوان البريد الإلكتروني (يجب أن يكون فريدًا داخل المستأجر)
name.givenNameلاالاسم الأول
name.familyNameلااسم العائلة
displayNameلاالاسم الكامل المعروض
activeلاما إذا كان المستخدم نشطًا (القيمة الافتراضية: true)
externalIdلاالمُعرّف من موفّر الهوية المنبع

PUT /scim/v2/Users/{id} — استبدال كامل لمورد المستخدم. يجب توفير جميع الحقول.

PATCH /scim/v2/Users/{id} — تحديث جزئي باستخدام SCIM PatchOp.

العمليةالمسارات المدعومةقيمة المثال
replaceactive, name.givenName, name.familyName, externalIdtrue / false، أو قيمة نصية
addname.givenName, name.familyName, externalIdقيمة نصية
removeexternalId(لا حاجة إلى قيمة)

DELETE /scim/v2/Users/{id} — يحذف المستخدم حذفًا ناعمًا (يعطّل الحساب ويُبطل جميع الرموز). تُعيد 204 No Content.

Create a user via SCIM
curl -X POST https://acme.authagonal.io/scim/v2/Users \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "[email protected]",
    "name": {
      "givenName": "Jane",
      "familyName": "Smith"
    },
    "displayName": "Jane Smith",
    "active": true,
    "externalId": "ext-12345"
  }'

المجموعات

GET /scim/v2/Groups — سرد جميع المجموعات مع تقسيم اختياري إلى صفحات وتصفية.

GET /scim/v2/Groups/{id} — الحصول على مجموعة واحدة عبر المُعرّف، بما في ذلك قائمة أعضائها.

POST /scim/v2/Groups — إنشاء مجموعة جديدة. تُعيد 201 Created.

الحقلمطلوبالوصف
displayNameنعمالاسم المعروض للمجموعة
membersلامصفوفة من كائنات الأعضاء، يحمل كل منها حقل value يحتوي على مُعرّف المستخدم
externalIdلاالمُعرّف من موفّر الهوية المنبع

PUT /scim/v2/Groups/{id} — استبدال كامل لمورد المجموعة (بما في ذلك قائمة أعضائها).

PATCH /scim/v2/Groups/{id} — تحديث جزئي لإضافة أعضاء المجموعة أو إزالتهم.

DELETE /scim/v2/Groups/{id} — يحذف المجموعة حذفًا نهائيًا. تُعيد 204 No Content.

Add members to a group via PATCH
curl -X PATCH https://acme.authagonal.io/scim/v2/Groups/GROUP_ID \
  -H "Authorization: Bearer SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [
      {
        "op": "add",
        "path": "members",
        "value": [
          { "value": "USER_ID_1" },
          { "value": "USER_ID_2" }
        ]
      }
    ]
  }'

استجابات أخطاء SCIM

عند فشل طلب SCIM، يتبع نص الاستجابة مخطط أخطاء SCIM: { "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "status": "400", "detail": "..." }. تشمل رموز الحالة الشائعة 400 (طلب غير صالح)، و404 (المورد غير موجود)، و409 (تعارض / تكرار)، و429 (تجاوز حد المعدل).

API البوابة (الأتمتة)

تتيح API البوابة لخادمك الخلفي أتمتة كل ما يمكنك القيام به في البوابة، أي إدارة المستخدمين والعملاء والمجموعات والأدوار والنطاقات واتصالات SSO والإعدادات، باستخدام بيانات اعتماد من آلة إلى آلة. وهي ذاتها الـ API التي تستدعيها واجهة البوابة.

عنوان URL الأساسي: https://portal-api.<your-domain>/api/v1. تُصادَق الطلبات برمز وصول من نوع Bearer، ويُؤخذ المستأجر من الرمز لا من عنوان URL.

إنشاء بيانات اعتماد لـ API

في البوابة، افتح العملاء ← إنشاء بيانات اعتماد API، واختر مستوى وصول، وامنحها اسمًا. ينشئ Authagonal عميل OAuth من نوع client_credentials مهيأً للعمل مع API البوابة، ويعيد معرّف عميل وسرًّا.

انسخ السر فورًا

يُعرض سر العميل مرة واحدة فقط، مباشرة بعد الإنشاء. خزّنه في مدير الأسرار لديك قبل إغلاق النافذة، فإن فقدته، احذف بيانات الاعتماد وأنشئ غيرها.

مستويات الوصول

النطاقيمنح
tenant:ownerوصول كامل، بما في ذلك الإجراءات التدميرية الخاصة بالمالك وحده مثل حذف المستأجر بأكمله.
tenant:adminإدارة كل شيء باستثناء الإجراءات الخاصة بالمالك وحده، أي المستخدمين والعملاء وSSO والمجموعات والأدوار والعلامة التجارية والإعدادات.
tenant:developerإدارة العملاء والنطاقات وتطبيقات التزويد.
tenant:supportقراءة المستخدمين وإدارتهم لأغراض مهام الدعم.

لا يمكنك منح أكثر مما تملك

لا يمكن أن تكون بيانات الاعتماد أعلى امتيازًا من الشخص الذي ينشئها. لا يستطيع المسؤول إصدار بيانات اعتماد بنطاق المالك، ولا يمكن أبدًا منح نطاق الإدارة على مستوى المنصة لأي بيانات اعتماد.

الحصول على رمز

بادل بيانات الاعتماد برمز وصول عند نقطة نهاية الرمز الخاصة بمستأجرك، أي https://<your-tenant>.<your-domain>/connect/token، ثم أرسل الرمز كترويسة Bearer إلى API البوابة. تظل الرموز صالحة لمدة ساعة واحدة.

احصل على رمز، ثم استدعِ الـ API
# 1. Exchange the credential for an access token (your tenant's token endpoint)
curl -X POST https://acme.authagonal.io/connect/token \
  -d grant_type=client_credentials \
  -d client_id=api-3f2a... \
  -d client_secret=YOUR_CLIENT_SECRET \
  -d scope=tenant:admin

# Response: { "access_token": "ey...", "token_type": "Bearer", "expires_in": 3600 }

# 2. Call the Portal API with the access token
curl https://portal-api.authagonal.io/api/v1/users \
  -H "Authorization: Bearer $ACCESS_TOKEN"

نقاط النهاية

جميع المسارات نسبية إلى عنوان URL الأساسي وتتطلب رمز وصول من نوع Bearer. النطاق المذكور بجانب كل مجموعة هو الحد الأدنى لمستوى وصول بيانات الاعتماد الذي تحتاجه. تقبل نقاط نهاية القوائم معاملي الاستعلام startIndex وcount.

العملاءtenant:developer

GET/api/v1/clients— سرد عملاء OAuth.

GET/api/v1/clients/{id}— الحصول على عميل واحد بمعرّفه.

POST/api/v1/clients— إنشاء عميل. يعيد معرّف العميل، وللعملاء السرّيين يعيد سرًّا يُستخدم مرة واحدة.

PUT/api/v1/clients/{id}— تحديث عميل (عناوين إعادة التوجيه URIs، أنواع المنح، فترات صلاحية الرموز، متطلبات PKCE/PAR).

DELETE/api/v1/clients/{id}— حذف عميل.

POST/api/v1/clients/api-credential— إصدار بيانات اعتماد API البوابة من آلة إلى آلة.

المستخدمونtenant:support

GET/api/v1/users— سرد المستخدمين. يدعم startIndex وcount والبحث (بادئة البريد الإلكتروني / الاسم).

GET/api/v1/users/count— إجمالي عدد المستخدمين للمستأجر.

GET/api/v1/users/stats/mfa— إحصائيات تسجيل MFA.

GET/api/v1/users/{id}— الحصول على مستخدم واحد.

POST/api/v1/users— إنشاء مستخدم ببريد إلكتروني وكلمة مرور.

PUT/api/v1/users/{id}— تحديث مستخدم (الملف الشخصي، البريد الإلكتروني، حالة التمكين/الحظر).

DELETE/api/v1/users/{id}— حذف مستخدم.

GET/api/v1/users/{id}/mfa— Get a user's enrolled MFA methods.

DELETE/api/v1/users/{id}/mfa— Reset a user's MFA enrollment.

الأدوارtenant:admin

GET/api/v1/roles— سرد الأدوار.

POST/api/v1/roles— إنشاء دور.

DELETE/api/v1/roles/{id}— حذف دور.

POST/api/v1/roles/assign— تعيين دور لمستخدم.

POST/api/v1/roles/unassign— إزالة دور من مستخدم.

المجموعاتtenant:admin

GET/api/v1/groups— سرد المجموعات.

GET/api/v1/groups/{id}— الحصول على مجموعة مع أعضائها.

POST/api/v1/groups— إنشاء مجموعة.

POST/api/v1/groups/{id}/members— إضافة أعضاء إلى مجموعة.

DELETE/api/v1/groups/{groupId}/members/{userId}— إزالة عضو من مجموعة.

DELETE/api/v1/groups/{id}— حذف مجموعة.

GET/api/v1/group-role-mappings— سرد تعيينات المجموعات إلى الأدوار (الأدوار الممنوحة عند إصدار الرمز بحسب عضوية المجموعة).

النطاقاتtenant:developer

GET/api/v1/scopes— سرد نطاقات API.

POST/api/v1/scopes— إنشاء نطاق.

DELETE/api/v1/scopes/{name}— حذف نطاق.

اتصالات SSOtenant:admin

GET/api/v1/saml/connections— سرد اتصالات SAML.

POST/api/v1/saml/connections— إنشاء اتصال SAML.

DELETE/api/v1/saml/connections/{id}— حذف اتصال SAML.

GET/api/v1/oidc/connections— سرد اتصالات OIDC.

POST/api/v1/oidc/connections— إنشاء اتصال OIDC.

DELETE/api/v1/oidc/connections/{id}— حذف اتصال OIDC.

GET/api/v1/sso/domains— سرد النطاقات الموجَّهة إلى اتصالات SSO (اكتشاف نطاق الهوية الأصلي).

العلامة التجاريةtenant:admin

GET/api/v1/branding— الحصول على العلامة التجارية للمستأجر (الألوان، الشعار، اللغات المدعومة).

PUT/api/v1/branding— تحديث العلامة التجارية للمستأجر.

الإعداداتtenant:admin

GET/api/v1/settings— الحصول على إعدادات المستأجر (خطافات الويب، التسجيل العام، سياسة الرموز).

PUT/api/v1/settings— تحديث إعدادات المستأجر.

POST/api/v1/settings/webhook-secret/regenerate— تدوير سر توقيع خطاف الويب.

POST/api/v1/settings/test-email— إرسال بريد إلكتروني تجريبي باستخدام إعدادات البريد الإلكتروني الحالية.

النطاقات المخصصة والبريد الإلكترونيtenant:admin

GET/api/v1/custom-domains— سرد نطاقات تسجيل الدخول المخصصة وحالة التحقق منها.

POST/api/v1/custom-domains— إضافة نطاق مخصص.

POST/api/v1/custom-domains/{domain}/verify— تشغيل التحقق عبر DNS لنطاق مخصص.

DELETE/api/v1/custom-domains/{domain}— إزالة نطاق مخصص.

GET/api/v1/email/domains— سرد نطاقات البريد الإلكتروني للمُرسِل.

سجل التدقيقtenant:admin

GET/api/v1/audit— الاستعلام في سجل تدقيق المستأجر.

تزويد المستخدمين عبر SCIM

لتزويد المستخدمين والمجموعات بالجملة من موفّر هوية (Entra، Okta)، استخدم SCIM 2.0 API بدلًا من نقاط النهاية هذه.

مثال: إنشاء مستخدم

POST /api/v1/users
curl -X POST https://portal-api.authagonal.io/api/v1/users \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "S3cure-temp-passw0rd",
    "firstName": "Ada",
    "lastName": "Lovelace"
  }'

# 200 OK
# { "userId": "8f3a...", "email": "[email protected]" }

كل ما تستطيع الواجهة فعله

تكشف API البوابة نقاط النهاية ذاتها التي تستخدمها واجهة البوابة، لذا يمكن أتمتة أي عملية يمكنك تنفيذها في البوابة، رهنًا بمستوى وصول بيانات الاعتماد.

شاشات تسجيل الدخول

هذه هي الشاشات المستضافة التي يراها المستخدمون النهائيون على خادم المصادقة الخاص بمستأجرك. يوفّر Authagonal كل شاشة جاهزة للاستخدام، فتحصل على تجربة تسجيل دخول كاملة وآمنة دون بناء أي واجهة. تستعرض هذه الصفحة كل شاشة وتبيّن أي إعدادات البوابة تتحكم بها.

علامة بيضاء بالكامل

كل شاشة هنا تُرسَم وفق إعدادات العلامة التجارية لمستأجرك، أي شعارك ولونك واسم تطبيقك وCSS المخصص. كما تحترم الشاشات prefers-color-scheme، فتنتقل بين الوضعين الفاتح والداكن لتطابق جهاز المستخدم.

تسجيل الدخول

Hosted sign-in screen with an email field, Continue button, single sign-on provider buttons, and forgot-password and create-account links
  • تدفق من خطوتين يبدأ بالبريد الإلكتروني: يُدخل المستخدم بريده الإلكتروني وينقر متابعة، ثم يظهر حقل كلمة المرور.
  • تظهر أزرار الدخول الموحّد "المتابعة باستخدام {provider}" تلقائيًا عند وجود اتصالات SSO.
  • روابط نسيت كلمة المرور وإنشاء حساب، ويمكن إظهار كلٍّ منها أو إخفاؤه.
  • اختبار Cloudflare Turnstile اختياري لردع محاولات تسجيل الدخول الآلية.

يُتحكم بها من إدارة البوابة

  • تضبط العلامة التجارية الشعار واللون واسم التطبيق والبريد الإلكتروني للدعم وCSS المخصص.
  • إظهار أو إخفاء رابطي نسيت كلمة المرور والتسجيل (العلامة التجارية).
  • تضيف اتصالات SSO أزرار الدخول الاجتماعي (صفحة SSO).
  • مدة الجلسة وعتبات القفل (الإعدادات → الأمان).

التسجيل

Account registration screen with first and last name fields, email, password, and a live password-policy checklist
  • يجمع الاسم الأول والأخير (اختياري) والبريد الإلكتروني وكلمة المرور.
  • قائمة تحقق حيّة لسياسة كلمة المرور تتحدث أثناء كتابة المستخدم، فتتضح المتطلبات قبل الإرسال.
  • اختبار Cloudflare Turnstile اختياري.
  • رابط "تسجيل الدخول" للمستخدمين الذين لديهم حساب بالفعل.

يُتحكم بها من إدارة البوابة

  • إظهار أو إخفاء رابط التسجيل (العلامة التجارية).
  • تتحكم سياسة كلمة المرور الخاصة بمستأجرك في قائمة التحقق.
  • تنسّق العلامة التجارية الشاشة بأكملها.

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

Forgot-password screen with an email field and a neutral check-your-email confirmation state
  • يُدخل المستخدم بريده الإلكتروني، ثم يرى تأكيدًا محايدًا بصيغة "تحقق من بريدك الإلكتروني".
  • الشاشة لا تكشف أبدًا ما إذا كان الحساب موجودًا، ما يحبط محاولات استكشاف الحسابات.
  • رابط "العودة إلى تسجيل الدخول" يعيد المستخدم إلى شاشة تسجيل الدخول.

يُتحكم بها من إدارة البوابة

  • إظهار أو إخفاء رابط نسيت كلمة المرور (العلامة التجارية).
  • يرسل توصيل البريد الإلكتروني الخاص بمستأجرك رسالة إعادة التعيين.
  • تنسّق العلامة التجارية الشاشة بأكملها.

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

Reset-password screen with new and confirm password fields and a live per-rule requirement checklist
  • حقلا كلمة المرور الجديدة وتأكيد كلمة المرور مع قائمة تحقق حيّة لكل قاعدة من المتطلبات.
  • حالة واضحة لـ رابط غير صالح أو منتهي الصلاحية عندما لا يعود رمز إعادة التعيين صالحًا.
  • حالة نجاح تؤكد تغيير كلمة المرور.

يُتحكم بها من إدارة البوابة

  • تتحكم سياسة كلمة المرور الخاصة بمستأجرك في قائمة التحقق.
  • تنسّق العلامة التجارية الشاشة بأكملها.

تحدي MFA

MFA challenge screen with a method switcher, a six-digit authenticator code field, recovery-code entry, and a passkey button
  • مبدّل طرق بين تطبيق المصادقة ومفتاح المرور ورمز الاسترداد.
  • حقل TOTP من 6 أرقام يُرسَل تلقائيًا بمجرد إدخال جميع الأرقام.
  • إدخال رمز الاسترداد للمستخدمين الذين فقدوا الوصول إلى تطبيق المصادقة لديهم.
  • زر مفتاح المرور للتحقق المدعوم بالعتاد.

يُتحكم بها من إدارة البوابة

  • تُضبط سياسة MFA لكل تطبيق على حدة (العملاء → الأمان).
  • أي مستخدم لديه عامل مسجَّل يُطالَب به دائمًا، بصرف النظر عن السياسة.

إعداد MFA

MFA setup screen showing enrolled-method status, authenticator QR code and manual key, passkey enrolment, and recovery-code generation
  • يعرض حالة الطرق المسجَّلة ليعرف المستخدم ما هو مُعدّ بالفعل.
  • إعداد تطبيق المصادقة عبر رمز QR، مع مفتاح يدوي بديل، وخطوة تأكيد.
  • تسجيل مفتاح المرور للمصادقة المدعومة بالعتاد.
  • إنشاء رموز الاسترداد لاستعادة الحساب.
  • تخطٍّ اختياري عندما يكون MFA بالخدمة الذاتية لا إلزاميًا.

يُتحكم بها من إدارة البوابة

  • تُضبط سياسة MFA لكل تطبيق على حدة، ويفرض الخيار إلزامي الإعداد عند تسجيل الدخول (العملاء → الأمان).
  • تنسّق العلامة التجارية الشاشة بأكملها.

تفويض الجهاز

Device authorization screen with a centered user-code entry field, an Approve button, and an approved confirmation state
  • حقل إدخال رمز المستخدم موسَّط للرمز المعروض على الجهاز.
  • خطوة موافقة لتفويض الجهاز.
  • شاشة تسجيل دخول وسيطة عندما لا يكون المستخدم مصادَقًا بعد.
  • تأكيد موافقة بمجرد تفويض الجهاز.

يُتحكم بها من إدارة البوابة

  • فعّل منح رمز الجهاز على التطبيق (العملاء → أنواع المنح).
  • اضبط مدة صلاحية رمز الجهاز (العملاء → الرموز).
Consent screen showing the requesting application's logo and name, a per-scope permission list, and Allow and Deny buttons
  • تعرض شعار العميل واسمه الطالب.
  • قائمة لكل نطاق بعناوين ودّية وسهلة القراءة لكل إذن.
  • زرّا السماح والرفض لمنح الوصول أو رفضه.
  • تذييل تلميح الموافقة يشرح ما يعنيه القرار.

يُتحكم بها من إدارة البوابة

  • فعّل اشتراط الموافقة لكل تطبيق على حدة (العملاء → الأمان).
  • يأتي الشعار والاسم وعنوان URL من البيانات الوصفية الخاصة بالتطبيق نفسه.
  • ترسم العلامة التجارية بطاقة الموافقة.

التطبيقات المتصلة (المنح)

Connected apps screen listing the applications a user has authorized with their scopes and granted date, plus a revoke control
  • تسرد كل تطبيق فوّضه المستخدم، مع اسمه ونطاقاته وتاريخ المنح.
  • إلغاء وصول تطبيق ما، مع خطوة تأكيد قبل نفاذ الإجراء.
  • حالة فارغة ودّية عندما لا يكون المستخدم قد فوّض أي تطبيقات.

يُتحكم بها من إدارة البوابة

  • تُملأ القائمة بـ التطبيقات التي تتطلب الموافقة.
  • تنسّق العلامة التجارية الشاشة بأكملها.

الحساب

صفحة حساب مستضافة بالخدمة الذاتية على /login/account حيث يدير المستخدمون المسجَّلون ملفهم الشخصي ولغتهم المفضّلة، دون الحاجة إلى الوصول إلى البوابة.

Self-service account screen with editable profile fields and a preferred Language selector
  • تحرير الاسم الأول والأخير والشركة والهاتف، ويُعرض عنوان البريد الإلكتروني للقراءة فقط.
  • اختيار لغة مفضّلة من اللغات المدعومة، وتعاين الواجهة الاختيار فورًا وتحفظه عند الحفظ.
  • تتحكم اللغة المحفوظة في الواجهة المستضافة للمستخدم وفي لغة الرسائل البريدية الإجرائية التي يتلقاها.

يُتحكم بها من إدارة البوابة

  • تنسّق العلامة التجارية الشاشة بأكملها.
  • اللغة المفضّلة ذاتها قابلة للتحرير من قبل المسؤول في صفحة المستخدمون بالبوابة.

تدفقات المصادقة

تغطي تدفقات المصادقة كيفية تفاعل المستخدمين النهائيين مع مستأجر Authagonal الخاص بك، أي تسجيل الدخول والتسجيل وإعادة تعيين كلمات المرور وإعداد MFA. تستخدم صفحة تسجيل الدخول المستضافة نقاط النهاية هذه، ويمكن استدعاؤها مباشرةً إن كنت تبني واجهة تسجيل دخول مخصصة.

تسجيل الدخول

POST /api/auth/login

يصادق المستخدم بالبريد الإلكتروني وكلمة المرور. عند النجاح، يوقّع ملف تعريف ارتباط للجلسة ويعيد الملف الشخصي للمستخدم. إذا كان MFA مهيأً، تشير الاستجابة إلى أن عاملًا ثانيًا مطلوب قبل ترسيخ الجلسة بالكامل.

نص الطلب:

Login request
{
  "email": "[email protected]",
  "password": "correct-horse-battery-staple"
}

استجابة النجاح:

الحقلالنوعالوصف
userIdstringمعرّف المستخدم الفريد
emailstringعنوان البريد الإلكتروني للمستخدم
namestringاسم العرض الكامل
mfaAvailablebooleanما إذا كان المستخدم قد سجّل طرق MFA

استجابة طلب MFA: عندما يكون المستخدم قد سجّل MFA، تتضمن الاستجابة mfaRequired: true إلى جانب challengeId ومصفوفة methods تسرد طرق MFA المتاحة.

استجابة طلب إعداد MFA: عندما يتطلب المستأجر MFA ولكن المستخدم لم يسجّل بعد، تتضمن الاستجابة mfaSetupRequired: true مع setupToken لتدفق التسجيل.

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

رمز الخطأحالة HTTPالوصف
invalid_credentials401البريد الإلكتروني أو كلمة المرور غير صحيحة
account_disabled403تم تعطيل الحساب من قبل مسؤول
email_not_confirmed403لم يتحقق المستخدم من عنوان بريده الإلكتروني
locked_out423الحساب مقفل مؤقتًا (يتضمن retryAfter بالثواني)
sso_required409نطاق البريد الإلكتروني مهيأ لـ SSO (يتضمن redirectUrl)

فحص SSO: إذا كان نطاق البريد الإلكتروني للمستخدم لديه اتصال SSO مهيأ، تعيد نقطة نهاية تسجيل الدخول sso_required مع redirectUrl. ينبغي للعميل إعادة توجيه المستخدم إلى موفّر SSO.

قفل الحساب: بعد maxFailedAttempts من محاولات تسجيل الدخول الفاشلة المتتالية، يُقفل الحساب لمدة lockoutDurationMinutes. كلا القيمتين قابلتان للضبط في إعدادات المستأجر.

صفحة تسجيل الدخول المستضافة

تستدعي صفحة تسجيل الدخول المستضافة نقطة نهاية تسجيل الدخول عادةً، لا تطبيقك مباشرةً. استخدم تدفق رمز التفويض في OIDC لبدء المصادقة، فسيُعاد توجيه مستخدميك إلى صفحة تسجيل الدخول المستضافة تلقائيًا.

التسجيل

POST /api/auth/register

ينشئ حساب مستخدم جديدًا. يُرسَل بريد تحقق تلقائيًا، وعلى المستخدم التحقق من بريده الإلكتروني قبل أن يتمكن من تسجيل الدخول.

نص الطلب:

Registration request
{
  "email": "[email protected]",
  "password": "a-strong-password-here",
  "firstName": "Jane",
  "lastName": "Smith"
}
الحقلمطلوبالوصف
emailنعمعنوان البريد الإلكتروني (يجب أن يكون فريدًا)
passwordنعميجب أن يستوفي سياسة كلمة المرور للمستأجر
firstNameلاالاسم الأول
lastNameلااسم العائلة

النجاح: 201 Created مع userId للحساب الجديد. التسجيل ببريد إلكتروني مستخدَم بالفعل يعيد 201 أيضًا: فنحن لا نكشف أبدًا ما إذا كان البريد الإلكتروني موجودًا (لمنع تعداد الحسابات)، وبدلًا من ذلك نُعلِم صاحب الحساب الحقيقي عبر البريد الإلكتروني.

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

رمز الخطأحالة HTTPالوصف
weak_password400كلمة المرور لا تستوفي سياسة كلمة المرور للمستأجر
rate_limited429محاولات تسجيل كثيرة جدًا
provisioning_rejected422رفض خطاف ويب للتزويد عملية التسجيل

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

تحقق من متطلبات كلمة المرور للمستأجر قبل الإرسال عبر GET /api/auth/password-policy. يعيد هذا الحد الأدنى للطول، وفئات الأحرف المطلوبة، وما إذا كان فحص كلمات المرور المخترقة مفعّلًا.

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

POST /api/auth/forgot-password

يطلب بريد إعادة تعيين كلمة المرور. تعيد نقطة النهاية دائمًا استجابة نجاح بصرف النظر عن وجود البريد الإلكتروني من عدمه، لمنع تعداد البريد الإلكتروني.

Forgot password request
{
  "email": "[email protected]"
}

POST /api/auth/reset-password

يعيد تعيين كلمة مرور المستخدم باستخدام الرمز الوارد في رابط البريد الإلكتروني.

Reset password request
{
  "token": "RESET_TOKEN_FROM_EMAIL",
  "newPassword": "new-strong-password"
}

الآثار الجانبية لإعادة تعيين كلمة المرور بنجاح:

  • يُعاد ضبط عدّاد محاولات تسجيل الدخول الفاشلة إلى صفر
  • تُلغى جميع رموز التحديث الموجودة
  • يُنشأ ختم أمان جديد (ما يُبطل جميع الجلسات الموجودة)

إعداد MFA والتحقق منه

يدعم Authagonal ثلاث طرق لـ MFA: TOTP (تطبيقات المصادقة)، وWebAuthn (مفاتيح الأمان والقياسات الحيوية)، ورموز الاسترداد ذات الاستخدام الواحد.

إعداد TOTP

POST /api/auth/mfa/totp/setup — يعيد عنوان URI لبيانات رمز QR ومفتاح إدخال يدوي. يمسح المستخدم رمز QR بتطبيق المصادقة لديه (Google Authenticator، Authy، 1Password، وغيرها)، ثم يؤكد التسجيل.

POST /api/auth/mfa/totp/confirm — يؤكد تسجيل TOTP عبر التحقق من رمز مكوّن من 6 أرقام من تطبيق المصادقة.

Confirm TOTP enrollment
{
  "code": "123456"
}

إعداد WebAuthn

POST /api/auth/mfa/webauthn/setup: يعيد خيارات إنشاء بيانات الاعتماد لـ WebAuthn API. يستدعي المتصفح navigator.credentials.create() بهذه الخيارات.

POST /api/auth/mfa/webauthn/confirm — يؤكد تسجيل WebAuthn عبر إرسال استجابة الإثبات من المتصفح.

رموز الاسترداد

POST /api/auth/mfa/recovery/generate — ينشئ 10 رموز استرداد من 8 أحرف تُستخدم مرة واحدة. يمكن استخدام كل رمز مرة واحدة بالضبط لتجاوز MFA.

تُعرض رموز الاسترداد مرة واحدة فقط

تُعرض رموز الاسترداد عند إنشائها فقط ولا يمكن استرجاعها لاحقًا. إذا فقد المستخدم جهاز المصادقة ورموز الاسترداد معًا، فيجب على مسؤول حذف بيانات اعتماد MFA الخاصة به يدويًا من البوابة قبل أن يتمكن من تسجيل الدخول مجددًا.

التحقق من MFA

POST /api/auth/mfa/verify — يكمل تحدي MFA بعد تسجيل دخول ناجح بكلمة المرور.

الحقلمطلوبالوصف
challengeIdنعممعرّف التحدي من استجابة تسجيل الدخول
methodنعم"totp" أو "recovery" أو "webauthn"
codeTOTP / الاستردادرمز TOTP من 6 أرقام أو رمز استرداد من 8 أحرف
assertionWebAuthnاستجابة التأكيد من navigator.credentials.get()

حالة MFA

GET /api/auth/mfa/status — يعيد طرق MFA المسجَّلة حاليًا للمستخدم.

تدفق تسجيل الدخول عبر SSO

يدعم Authagonal اتصالات SSO القائمة على SAML 2.0 وعلى OIDC. يكتشف التوجيه القائم على النطاق تلقائيًا أي موفّر SSO يجب استخدامه بناءً على عنوان البريد الإلكتروني للمستخدم.

فحص SSO

GET /api/auth/[email protected]

الحقلالنوعالوصف
ssoRequiredbooleanما إذا كان نطاق البريد الإلكتروني يتطلب SSO
providerTypestring"saml" أو "oidc"
connectionIdstringمعرّف اتصال SSO
redirectUrlstringعنوان URL الذي يُعاد توجيه المستخدم إليه لتسجيل الدخول عبر SSO

تدفق SAML

يُعاد توجيه المستخدم إلى GET /saml/{connectionId}/login الذي يرسل طلب SAML AuthnRequest إلى موفّر الهوية. يصادق موفّر الهوية المستخدم ويرسل استجابة SAML إلى نقطة نهاية خدمة استهلاك التأكيد (ACS). يتحقق Authagonal من التأكيد، وينشئ المستخدم أو يحدّثه، ويوقّع ملف تعريف ارتباط للجلسة.

تتوفر البيانات الوصفية لـ SAML لتهيئة موفّر الهوية لديك على GET /saml/{connectionId}/metadata.

تدفق OIDC

يُعاد توجيه المستخدم إلى GET /oidc/{connectionId}/login الذي يعيد التوجيه إلى موفّر الهوية الأعلى مع PKCE. بعد مصادقة المستخدم، يبادل رد النداء عند /oidc/callback رمز التفويض، ويتحقق من رمز الهوية، وينشئ المستخدم أو يحدّثه.

التزويد في الوقت المناسب (JIT): يدعم تدفقا SAML وOIDC التزويد في الوقت المناسب. إذا لم يكن المستخدم موجودًا بالفعل في المستأجر، يُنشأ تلقائيًا من مطالبات موفّر الهوية. وإن كان موجودًا، تُحدَّث سمات ملفه الشخصي لتطابق أحدث القيم من الموفّر.

التوجيه القائم على النطاق

يعني التوجيه القائم على النطاق أن مستخدميك لا يحتاجون إلى معرفة أي موفّر SSO يستخدمونه. يكفي إدخال عنوان بريدهم الإلكتروني، فيطابق Authagonal النطاق مع اتصال SSO الصحيح ويعيد التوجيه تلقائيًا.

بناء واجهة تسجيل دخول مخصصة

استبدل شاشات تسجيل الدخول والتسجيل وإعادة تعيين كلمة المرور وMFA المُستضافة من Authagonal بواجهتك الخاصة، بينما يواصل Authagonal التعامل مع المصادقة وMFA وSSO والجلسات وإصدار الرموز. مساران: استخدم مكتبة مكوّنات React لدينا، أو استدعِ واجهة API للمصادقة مباشرةً من أي إطار عمل. وهي ميزة اختيارية، فعّل أولاً واجهة تسجيل الدخول المخصصة في إعدادات المستأجر.

A fully customized hosted login page with a tenant logo, brand color, and support email in the footer

شرط مسبق: نطاق مخصص على جذرك

جلسة تسجيل الدخول هي ملف تعريف ارتباط من الطرف الأول، لذا يجب أن تشترك واجهتك وخادم مصادقة Authagonal في نطاق قابل للتسجيل. وجّه نطاق مصادقة مخصصاً إلى Authagonal على الجذر نفسه الذي يعمل عليه تطبيقك، مثل المصادقة على login.acme.com والتطبيق على app.acme.com. ويبقى إعداد واجهة تسجيل الدخول المخصصة معطّلاً حتى يوجد نطاق مخصص نشط.

واجهتكمضيف المصادقةيعمل؟
app.acme.comlogin.acme.com✅ الجذر نفسه
acme.comauth.acme.com✅ الجذر نفسه
app.acme.comacme.authagonal.io❌ عبر المواقع
myapp.iologin.acme.com❌ عبر المواقع

لماذا يُشترط نطاق مخصص

ملف تعريف ارتباط الجلسة عبر المواقع سيكون ملف تعريف ارتباط من طرف ثالث، وهو ما تتخلّص منه المتصفحات (Safari وChrome) تدريجياً. وإبقاء المصادقة على جذرك الخاص يجعل ملف تعريف الارتباط من الطرف الأول وجاهزاً للمستقبل، وهو ما تفرضه المنصة: لا تُقبل استدعاءات المصادقة عبر الأصول إلا من أصل يشترك في النطاق الجذر لمضيف المصادقة.

أضف أيضاً أصل واجهتك (مثل https://app.acme.com) إلى أصول CORS المسموح بها لعميل OAuth الخاص بك، وهي القائمة نفسها التي تضبطها لتبادل الرموز.

React: ‏@authagonal/login

npm i @authagonal/login يشحن منطق المصادقة وواجهة المستخدم في حزمة واحدة، وهي نفسها التي بُني عليها تسجيل الدخول المُستضاف من Authagonal. اختر مستواك:

  • تطبيق كامل، أدرج App ونسّقه عبر العلامة التجارية.
  • تركيب الصفحات، استخدم LoginPage وMfaChallengePage وResetPasswordPage… داخل تخطيطك الخاص.
  • العناصر الأولية والمنطق، ابنِ شاشاتك الخاصة باستخدام AuthLayout/Button/Input وعميل API (login وmfaVerify وforgotPassword …).
شاشة مخصصة تستخدم واجهة API الخاصة بـ @authagonal/login
import { AuthLayout, Input, Button, login, ApiRequestError } from '@authagonal/login';

function MyLogin() {
  async function onSubmit(email: string, password: string) {
    try {
      const res = await login({ email, password });        // POST /login (sets the session cookie)
      if (res.mfaRequired) {/* render your MFA step → mfaVerify(...) */}
      else window.location.href = res.returnUrl;            // hand off to /connect/authorize
    } catch (e) {
      if (e instanceof ApiRequestError) {/* show e.message */}
    }
  }
  return <AuthLayout>{/* your own markup + <Input/> <Button/> */}</AuthLayout>;
}

أي إطار عمل: استدعِ واجهة API للمصادقة

لست على React؟ استدعِ نقاط نهاية تدفق المصادقة مباشرةً (تحت /api/auth)، ثم سلّم إلى تدفق OIDC القياسي /connect/authorize. أرسل credentials: 'include' كي يُخزَّن ملف تعريف ارتباط الجلسة.

نقطة النهايةالغرض
POST /api/auth/loginالمصادقة؛ تعيد mfaRequired أو عنوان URL للعودة
POST /api/auth/registerالتسجيل بالخدمة الذاتية (عند تفعيله)
POST /api/auth/forgot-passwordبدء إعادة تعيين كلمة المرور
POST /api/auth/reset-passwordإتمام إعادة تعيين كلمة المرور
GET /api/auth/password-policyسياسة كلمة المرور (لعرض القواعد)
POST /api/auth/mfa/*إعداد MFA والتحقق منه (TOTP وWebAuthn والاسترداد)

استخدم credentials: 'include'

الجلسة هي ملف تعريف ارتباط، لذا يجب أن ترسل عمليات الجلب لديك بيانات الاعتماد. ولا تنجح الاستدعاءات عبر الأصول إلا عند تفعيل واجهة تسجيل الدخول المخصصة واشتراك أصلك في النطاق الجذر لمضيف المصادقة، وإلا فتُرفض برمز 403.
صادِق، ثم سلّم إلى OIDC
# 1. Authenticate (browser fetch — credentials:'include' so the session cookie is stored)
curl -i -X POST https://login.acme.com/api/auth/login \
  -H "Content-Type: application/json" \
  -H "Origin: https://app.acme.com" \
  --data '{"email":"[email protected]","password":"..."}'
# (handle {"mfaRequired":true} → POST /api/auth/mfa/verify, then continue)

# 2. Hand off to the OAuth flow — top-level navigation to the authorize endpoint with PKCE:
# https://login.acme.com/connect/authorize?client_id=my-app&redirect_uri=...&response_type=code
#   &scope=openid%20profile%20email&code_challenge=...&code_challenge_method=S256
# The session cookie (same-site) authenticates the user; you get back a code → exchange at /connect/token.

الخطط والحدود

يقدّم Authagonal أربع مستويات للخطط. تشمل جميع الخطط كل الميزات، والفارق الوحيد هو حد المستخدمين النشطين شهرياً (MAU) وتسعير التجاوز.

مستويات الخطط

الخطةحد MAUالتجاوزتكلفة التجاوز/المستخدم
Starter1,000لا
Pro5,000نعم$0.04/مستخدم
Scale25,000نعم$0.025/مستخدم
Enterprise100,000نعم$0.015/مستخدم

المستخدمون النشطون شهرياً (MAU)

المستخدم النشط شهرياً هو أي مستخدم فريد يصادق بنجاح مرة واحدة على الأقل خلال شهر الفوترة. أما المستخدمون المُزوَّدون عبر SCIM ولم يسجّلوا الدخول فلا يُحتسبون ضمن إجمالي MAU لديك.

التجاوز إذا كانت خطتك تدعم التجاوز، يُحتسب المستخدمون الذين يتجاوزون حد MAU بالسعر لكل مستخدم المبيّن في جدول الخطط أعلاه. ويمكنك تحديد سقف للتجاوز للحد من إنفاقك الأقصى خلال فترة الفوترة.

التطبيق إذا كانت خطتك لا تدعم التجاوز (Starter)، فلن يتمكن المستخدمون الذين يتجاوزون حد MAU من تسجيل الدخول حتى فترة الفوترة التالية أو حتى ترقّي إلى خطة تدعم التجاوز.

مجموعة الميزات الكاملة في كل خطة

تشمل جميع الخطط مجموعة الميزات الكاملة: SSO وSCIM وMFA والنطاقات المخصصة والعلامة التجارية وخطافات الويب وسجل التدقيق والبوابة.