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

# المصادقة

> تسجّل حزمة التطوير دخول لعبتك وتدير جلسات اللاعبين نيابةً عنك.

للمصادقة في Flock **طبقتان**، وتتولّى حزمة التطوير كلتيهما:

1. **اللعبة** — تصادق الحزمة لعبتك ببيانات الاعتماد التي تضبطها مرة واحدة (مفتاح الواجهة البرمجية،
   ومعرّف اللعبة، وإصدار اللعبة). ويُعرَّف بعدها كل طلب ترسله على أنه صادر عن لعبتك.
2. **اللاعب** — يسجّل اللاعبون الدخول عبر الحزمة، ثم تدير هي جلساتهم تلقائيًا طوال اللعب.

<h2 id="configure-your-game">
  اضبط لعبتك
</h2>

اضبط بيانات اعتمادك في إعدادات محرّكك — **Flock → Settings** في Unity، و**Project Settings →
Plugins → Flock SDK** في Unreal. ويقوم المحرّر أيضًا **بالتحقّق من الاتصال** و**حلّ إصدار لعبتك**،
وكلاهما مطلوب قبل أن تبدأ الحزمة (راجع الإعداد في [Unity](/ar/sdk/unity#setup) أو
[Unreal](/ar/sdk/unreal#setup)). ومع تفعيل **Auto-Initialize On Load** تصادق الحزمة نفسها بوصفها
لعبتك عند بدء التشغيل؛ وعطّله لتهيّئها بنفسك.

وتصل إلى كل شيء عبر `FlockClient.Instance` في Unity، أو `UFlockSubsystem::Get(this)` في Unreal.

<h2 id="sign-in-a-player">
  سجّل دخول لاعب
</h2>

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

<Note>
  **تظهر الإخفاقات بصورة مختلفة في كل محرّك.** ترمي Unity استثناء `FlockException`؛ بينما تُعيد
  Unreal قيمة `TFlockResult` تتحقّق منها، لأن Unreal تُبنى مع تعطيل الاستثناءات. كما أن كل استدعاء
  في Unreal هو أيضًا عقدة Blueprint لها طرف **On Failure**.
</Note>

<Tabs>
  <Tab title="البريد الإلكتروني / كلمة المرور">
    <CodeGroup>
      ```csharp Unity theme={null}
      await FlockClient.Instance.Authentication.LoginWithEmailAsync(email, password);
      ```

      ```cpp Unreal theme={null}
      Sdk->GetAuthProvider()->LoginWithEmail(Email, Password, OnLogin);
      ```
    </CodeGroup>
  </Tab>

  <Tab title="معرّف الجهاز">
    تسجيل دخول كضيف بلا احتكاك، مرتبط بالجهاز:

    <CodeGroup>
      ```csharp Unity theme={null}
      await FlockClient.Instance.Authentication.LoginWithDeviceAsync(deviceId);
      ```

      ```cpp Unreal theme={null}
      Sdk->GetAuthProvider()->LoginWithDevice(DeviceId, OnLogin);
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Google / Apple / Steam / Facebook / Discord">
    مرّر الرمز أو التذكرة الصادرة عن المنصة إلى الدالة المقابلة. في Unity: `LoginWithGoogleAsync`،
    و`LoginWithAppleAsync`، و`LoginWithSteamAsync`، و`LoginWithFacebookAsync`،
    و`LoginWithDiscordAsync`. أما Unreal فتُسقط اللاحقة `Async` — `LoginWithGoogle`، وهكذا.

    وفي الحالتين تستبدل الحزمة بيان اعتماد سبق أن أنتجته حزمة تطوير المنصة لديك؛ فهي لا تحصل عليه
    نيابةً عنك. تتطلّب Google **رمز هوية (ID token)**، وApple **رمز هوية (identity token)**، وSteam
    **تذكرة جلسة (session ticket)**.
  </Tab>
</Tabs>

**التسجيل وتسجيل الدخول استدعاءان منفصلان** في كلتا الحزمتين — فتسجيل الدخول لا يُنشئ حسابًا،
والتسجيل لا يسجّل دخول اللاعب. استخدم `RegisterWith…Async` (في Unity) أو `RegisterWith…` (في
Unreal) لخطوة إنشاء الحساب.

وتسجيل هوية لها حساب بالفعل يُبلَّغ عنه بوصفه **نجاحًا**، مع علامة تتيح لك توجيه اللاعب إلى تسجيل
الدخول بدل عرض إخفاق عليه. وفي Unreal يقتصر Facebook وDiscord على تسجيل الدخول — إذ يجب أن يكون
الحساب موجودًا مسبقًا.

وبعد ذلك، اقرأ `FlockClient.Instance.CurrentPlayerId` (في Unity) أو `Flock Get Player Id` /
`GetPlayerId()` (في Unreal)، أو تعامَل مع الحدث `OnAuthenticated`.

أتختار اسمًا معروضًا؟ تحقّق أولًا من أنه متاح — وهو تحقّق استرشادي، إذ يمكن أن يحجزه لاعب آخر في
هذه الأثناء:

<CodeGroup>
  ```csharp Unity theme={null}
  bool available = await FlockClient.Instance.Authentication.IsNameAvailableAsync("PlayerName");
  ```

  ```cpp Unreal theme={null}
  Sdk->GetAuthProvider()->IsNameAvailable(TEXT("PlayerName"), OnChecked);
  ```
</CodeGroup>

<h2 id="password-reset">
  إعادة تعيين كلمة المرور
</h2>

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

<CodeGroup>
  ```csharp Unity theme={null}
  // 1. Player enters their email; Flock emails them a reset code
  await FlockClient.Instance.Authentication.ForgotPasswordAsync(email);

  // 2. Player enters the code and their new password
  await FlockClient.Instance.Authentication.ResetPasswordAsync(email, code, newPassword);
  ```

  ```cpp Unreal theme={null}
  Sdk->GetAuthProvider()->ForgotPassword(Email, OnSent);
  Sdk->GetAuthProvider()->ResetPassword(Email, Code, NewPassword, OnReset);
  ```
</CodeGroup>

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

<h2 id="email-verification">
  التحقّق من البريد الإلكتروني
</h2>

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

<CodeGroup>
  ```csharp Unity theme={null}
  await FlockClient.Instance.Authentication.SendEmailVerificationAsync();

  // Player enters the emailed code
  await FlockClient.Instance.Authentication.VerifyEmailAsync(code);
  ```

  ```cpp Unreal theme={null}
  Sdk->GetAuthProvider()->SendEmailVerification(OnSent);
  Sdk->GetAuthProvider()->VerifyEmail(Code, OnVerified);
  ```
</CodeGroup>

<h2 id="signing-out">
  تسجيل الخروج
</h2>

يمسح `Logout()` الجلسة على الجهاز — وهو تسجيل الخروج المعتاد من جهة العميل. أما للأجهزة المشتركة
أو الجلسات المخترقة، فإن `RevokeTokenAsync()` يُنهي إضافةً إلى ذلك جلسة اللاعب **على الخادم**، بحيث
يتوقّف أي رمز جلسة مسروق عن العمل:

<CodeGroup>
  ```csharp Unity theme={null}
  // Routine sign-out
  FlockClient.Instance.Authentication.Logout();

  // Hardened sign-out: revoke on the server, then clear locally
  await FlockClient.Instance.Authentication.RevokeTokenAsync();
  FlockClient.Instance.Authentication.Logout();
  ```

  ```cpp Unreal theme={null}
  // Routine sign-out
  Sdk->GetAuthProvider()->Logout();

  // Hardened sign-out: revoke on the server, then clear locally
  Sdk->GetAuthProvider()->RevokeToken([Sdk](TFlockResult<FFlockTokenRevokeResponse>)
  {
      Sdk->GetAuthProvider()->Logout();
  });
  ```
</CodeGroup>

<h2 id="sessions-are-managed-for-you">
  الجلسات مُدارة نيابةً عنك
</h2>

جلسات اللاعبين قصيرة العمر خلف الكواليس، لكن **حزمة التطوير تجدّدها تلقائيًا** — فلا داعي لأن تفكّر
في الرموز أو في انتهاء صلاحيتها. وإن احتاج لاعب إلى تسجيل الدخول من جديد، أطلقت الحزمة الحدث
`OnAuthExpired` على مركز أحداثها.

<Tip>
  تعامَل مع إخفاقات تسجيل الدخول لتعرض مسار إعادة محاولة نظيفًا عند خطأ في بيانات الاعتماد أو
  انقطاع الشبكة. في Unity غلّف الاستدعاء بـ`try/catch` لالتقاط `FlockException`؛ وفي Unreal تحقّق
  من `Result.bSuccess`، أو وصّل طرف **On Failure** في العقدة.
</Tip>
