> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livingsecurity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# بيانات اعتماد عميل OAuth

> قم بتجهيز عميل حساب خدمة محدد النطاق، وتعامل مع الأسرار ذات الاستخدام الواحد، واستعد الوضع بأمان بعد الطلبات غير المؤكدة.

استخدم بيانات اعتماد عميل OAuth عندما يحتاج تكامل الواجهة الخلفية لديك إلى رموز وصول قصيرة العمر
أو عندما تتطلب سياسة الأمان لديك ذلك. ينتمي كل عميل إلى
حساب خدمة واحد ومؤسسة واحدة. **OAuth اختياري:** يكفي مفتاح
API محدد النطاق لتكامل خادم خاص يمكنه تخزين المفتاح
وتدويره بأمان. راجع [المصادقة](/ar/developers/v1/authentication) للاختيار
بين الطريقتين وفهم كيفية ارتباط حسابات الخدمة بهما.

<Note>
  يجب تفعيل الوصول عبر OAuth لمؤسستك. يوفر الإعداد الخاص بك
  نقطة نهاية الرمز الإقليمية والجهة المصدِرة والجمهور المستهدف
  وطريقة مصادقة العميل. إذا كنت بحاجة إلى هذه الإعدادات أو لا يمكنك الوصول إلى إدارة العملاء،
  فاتصل بدعم
  Living Security.
</Note>

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

## قبل البدء

* أنشئ [حساب خدمة](/ar/developers/developer-hub/service-accounts) بالأذونات
  التي يحتاج إليها التكامل فقط.
* استخدم بيانات اعتماد إدارية مع `service_account:manage` وكل إذن
  تريد منحه للعميل الجديد. يجب أن يملك الحساب المستهدف هذه
  الأذونات أيضًا. لا يمكن للعميل توسيع صلاحيات أي من الحسابين.
* اختر [المنطقة](/ar/developers/v1/regions) الخاصة بالمؤسسة. يجب استخدام بيانات اعتماد API
  ورموز الوصول عبر OAuth على مضيف API الإقليمي المطابق.
* احتفظ بسر العميل والرموز في مخزن الأسرار على جانب الخادم لديك. لا تضعها أبدًا
  في شيفرة المتصفح أو تطبيقات الجوال أو التحكم في المصدر أو سجلات الطلبات.

## إنشاء عميل

يتطلب `POST /v1/oauth_clients` `service_account_id`، وقائمة غير فارغة من
`scopes` الصريحة، و`Idempotency-Key`. لا تُقبل الأحرف البديلة. يدعم العميل
ما يصل إلى 100 نطاق، بطول إجمالي لا يزيد على 4,096 حرفًا. يمكن أن يكون لكل حساب
خدمة 20 عميلًا على الأكثر أو عمليات إنشاء/تنظيف غير محسومة. يؤدي
الإبطال إلى رفض الوصول إلى API فورًا. ويستمر احتساب العميل أو عملية إنشاء غير مؤكدة لدى
المزوّد ضمن الحد إلى أن يتم تأكيد التنظيف عن بُعد.
ويمكن تحرير موضع الحجز المهجور أو عملية إنشاء ثبت فشلها قبل بدء عمل المزوّد
بأمان. يظل مفتاح إعادة المحاولة الخاص بها مرتبطًا بالمحاولة الأصلية؛
لذا استرجع إيصالها قبل أن تقرر إنشاء بديل.

اختر مفتاح إعادة محاولة واحدًا لمحاولة الإنشاء هذه واحفظه **قبل** إرسال
الطلب. استخدم من 1 إلى 255 حرف ASCII مرئيًا، بدون مسافات. أعد استخدامه مع
الحساب والنطاقات والجهة الإدارية والمنطقة وإصدار API نفسها بعد فقدان
الاستجابة. لا يؤدي تدوير بيانات الاعتماد الإدارية ضمن حساب الخدمة نفسه
إلى إنشاء هوية إعادة محاولة جديدة.

ثبّت حزمة `requests` الخاصة بـ Python. حمّل قيم البيئة التالية عبر
إدارة الأسرار والتكوين المعتادة لديك:

| المتغير | القيمة |
| - | - |
| `LIVING_SECURITY_API_KEY` | مفتاح API الإداري |
| `LIVING_SECURITY_REGION` | `us` أو `eu` |
| `LIVING_SECURITY_SERVICE_ACCOUNT_ID` | معرّف حساب الخدمة المستهدف |
| `LIVING_SECURITY_OAUTH_CREATE_KEY` | مفتاح إعادة المحاولة المحفوظ سابقًا |

```python Python theme={null}
import os
import requests

HOSTS = {
    "us": "https://api.us-east-1.livingsecurity.ai/v1",
    "eu": "https://api.eu-west-1.livingsecurity.ai/v1",
}
base = HOSTS[os.environ["LIVING_SECURITY_REGION"]]
response = requests.post(
    f"{base}/oauth_clients",
    auth=("apikey", os.environ["LIVING_SECURITY_API_KEY"]),
    headers={
        "Living-Security-Version": "2026-07-01",
        "Idempotency-Key": os.environ["LIVING_SECURITY_OAUTH_CREATE_KEY"],
    },
    json={
        "service_account_id": os.environ["LIVING_SECURITY_SERVICE_ACCOUNT_ID"],
        "scopes": ["organization:read"],
    },
    timeout=(5, 30),
    allow_redirects=False,
)
try:
    if response.status_code != 201:
        raise RuntimeError(
            f"Client creation needs review: HTTP {response.status_code}; "
            f"request_id={response.headers.get('Request-Id', 'unknown')}"
        )
    client = response.json()
    if client.get("object") != "oauth_client" or not client.get("id"):
        raise RuntimeError("Unexpected client receipt; preserve the retry key")
    if client.get("status") != "active" or not client.get("client_secret"):
        raise RuntimeError(
            f"Client {client['id']} needs recovery; no usable secret was returned"
        )
    # Persist client['id'], client['client_id'], and client['client_secret']
    # directly in your secret manager before using the client. Do not print them.
finally:
    response.close()
```

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

تستخدم استجابات الإنشاء والإيصال `201` وتحتوي على مورد `oauth_client`
مع `id` و`service_account_id` و`client_id` و`scopes` و`status` و`created_at` و
`client_secret`. تُوسَم الاستجابات بـ `Cache-Control: no-store`.

* **`id`** يحدد مورد المنصة. احفظه للاسترجاع والإبطال.
* **`client_id`** يحدد العميل أثناء تبادل الرموز. وليس
  معرّف مورد المنصة. ويمكن أن يكون `null` أثناء انتظار الإنشاء.
* **`client_secret`** يُعاد فقط للطلب الذي يُكمل الإنشاء.
  كل طلب إنشاء مكرر يعيد `null`، بما في ذلك إعادة المحاولة بعد فقدان
  استجابة النجاح. ولا يعيد الاسترجاع أي سر.

## الاسترداد بعد فقدان الاستجابة أو انقطاعها

كرر طلب الإنشاء نفسه باستخدام مفتاح إعادة المحاولة المحفوظ لاسترجاع إيصال
المورد. يعكس الإيصال الحالة الراهنة، لذا يبقى العميل المُبطَل مُبطَلًا.
لا تستخدم هذه العملية عقد إعادة تشغيل الاستجابة المخزنة مؤقتًا العام لمدة 24 ساعة
ولا تعيد ترويسة `Idempotent-Replayed`.

| النتيجة | الإجراء التالي |
| - | - |
| `active`، السر موجود | احفظ السر بأمان وتابع عملية الإعداد. |
| `active`، السر غير موجود | لا يمكن استرداد السر. أبطل هذا العميل، وتأكد من الإبطال، ثم أنشئ بديلًا باستخدام مفتاح إعادة محاولة جديد. |
| `pending` | الإنشاء غير مؤكد. احتفظ بمفتاح إعادة المحاولة نفسه. استرجع المورد لفحص الحالة؛ ولا تنشئ نسخًا مكررة لتجاوز حالة عدم اليقين. |
| `revoked` أو `disabled` أو `expired` | لا تستخدم هذا العميل. تأكد من تكوين الحساب المقصود قبل تجهيز بديل. |
| `409 idempotency_key_reuse` | تغيّر الطلب تحت مفتاح موجود. استرجع العملية الأصلية قبل أن تقرر ما إذا كانت هناك حاجة إلى إنشاء منفصل. |
| `409 invalid_request` | تحقق من حالة الحساب المستهدف وأذوناته الممنوحة. إذا تم بلوغ حد العملاء، فأكمل التنظيف قبل إعادة المحاولة؛ فتغيير مفتاح إعادة المحاولة لا يحرر السعة. |
| `429` | التزم بـ `Retry-After`؛ واحتفظ بالمفتاح والطلب نفسيهما. |
| `500` أو `503` أو انتهاء مهلة الشبكة | قد تكون النتيجة غير معروفة. احتفظ بالمفتاح والمدخلات؛ واسترجع الإيصال قبل إنشاء عميل آخر. |
| `401` أو `403` | عالج مشكلة الوصول المتعلقة ببيانات الاعتماد أو الأذونات أو الاستحقاق قبل إعادة المحاولة. |
| `404` | تأكد من تفعيل OAuth والمضيف الإقليمي وملكية المورد. |

راجع [الأخطاء](/ar/developers/v1/errors/overview) لمعرفة معرّفات الطلبات وتفاصيل الاسترداد.
لا ترسل أبدًا سر العميل أو رمز الوصول مع طلب دعم.

## الفحص والإبطال

استخدم بيانات الاعتماد الإدارية لديك و`id` الخاص بمورد المنصة:

| العملية | الطلب | النجاح |
| - | - | - |
| فحص الحالة الحالية | `GET /v1/oauth_clients/{id}` | `200`، مورد العميل بدون سر |
| إبطال الوصول | `DELETE /v1/oauth_clients/{id}` | `200`، مورد العميل المُبطَل بدون سر |

يحظر الإبطال طلبات API اللاحقة الخاصة بالعميل، بما في ذلك الطلبات التي تستخدم
رموزًا صادرة مسبقًا. ولا يلغي العمل الذي قبله API بالفعل.
قد يكتمل تنظيف بيانات الاعتماد عن بُعد لاحقًا. تكرار الإبطال آمن
ولا يتطلب مفتاح إعادة محاولة. واصل استخدام بيانات الاعتماد الإدارية إذا كان العميل
الذي يجري إبطاله هو نفسه مستدعي API.

## التدوير دون فقدان الوصول

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

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


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.