> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# المصادقة عبر LDAP

<Info>
  طُوّرت هذه الميزة من قِبل [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). ونقدّم هنا بعض الوثائق لمساعدتك في الإعداد.
</Info>

<Warning>
  يستخدم Overleaf مكتبة **passport-ldapauth**، وهي قديمة نسبيًا، لذا لا يمكن ضمان التوافق الكامل مع LDAP. ومع بعض مزوّدي هوية LDAP (على سبيل المثال، [https://goauthentik.io/](https://goauthentik.io/))، قد تحدث حالات فشل في تسجيل الدخول. لذلك، يُنصح إن أمكن باستخدام طريقة OAuth/SAML أولًا. بالنسبة إلى goauthentik، اتبع [دليل خطوة بخطوة: goauthentik](/ar/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication) أدناه، فقد تم اختباره.
</Warning>

### ما هو LDAP

LDAP هو بروتوكول مصادقة يُستخدم للتحقق من الهوية خارجيًا. يوفّر Overleaf Server Pro نموذج تسجيل دخول مخصصًا لـ LDAP في واجهة الويب، منفصلًا عن طريقة المصادقة القياسية. عندما يُدخل المستخدم اسم المستخدم وكلمة المرور الخاصين به في LDAP، تتحقق الواجهة الخلفية لـ Overleaf من بيانات الاعتماد مقابل خادم LDAP المُعدّ، على سبيل المثال `ldap://ldap:10389`.

<Frame caption="مثال على LDAP في Server Pro">
  <img src="https://mintcdn.com/ayakaleaf-pro/x9kfDjtWlyyhG_mR/images/on-premises/image-29.png?fit=max&auto=format&n=x9kfDjtWlyyhG_mR&q=85&s=f3ebcacecec45115cf9b1fa55eb1ba94" alt="" width="2804" height="2005" data-path="images/on-premises/image-29.png" />
</Frame>

### الإعداد

داخليًا، يستخدم LDAP في Overleaf مكتبة [passport-ldapauth](https://github.com/vesse/passport-ldapauth). وتُمرَّر معظم خيارات الإعداد هذه إلى كائن الإعداد `server` الذي يُستخدم لإعداد `passport-ldapauth`. إذا واجهت مشكلات في إعداد LDAP، فمن المفيد قراءة ملف README الخاص بـ `passport-ldapauth` لفهم الإعدادات التي يتوقعها.

متغير البيئة `EXTERNAL_AUTH` مطلوب لتفعيل وحدة المصادقة عبر LDAP. يحدد متغير البيئة هذا طرق المصادقة الخارجية المفعّلة. وقيمة هذا المتغير عبارة عن قائمة. إذا تضمنت القائمة `ldap` فسيتم تفعيل المصادقة عبر LDAP.

على سبيل المثال: `EXTERNAL_AUTH=ldap saml`

على خلاف Overleaf CEP، فإننا في إصدار ayaka-notes نقصر المصادقة عبر LDAP على كونها طريقة مصادقة بحتة، وهي متاحة على `http://your-overleaf.com/ldap/login`.

عند استخدام طرق المصادقة عبر LDAP، يُدخل المستخدم `username` و `password` في نموذج تسجيل الدخول، وتتم المحاولة كما يلي:

1. يتم البحث عن مستخدم LDAP في دليل LDAP باستخدام المرشّح المحدد في `OVERLEAF_LDAP_SEARCH_FILTER` ثم تتم مصادقته.
2. إذا نجحت المصادقة، يتم فحص قاعدة بيانات مستخدمي Overleaf بحثًا عن مستخدم يطابق عنوان بريده الإلكتروني الأساسي عنوانَ البريد الإلكتروني لمستخدم LDAP الذي تمت مصادقته:
   * إذا عُثر على مستخدم مطابق، يُحذف الحقل `hashedPassword` لهذا المستخدم (إن وُجد). ويضمن ذلك أن المستخدم لن يتمكن مستقبلًا من تسجيل الدخول إلا عبر المصادقة بـ LDAP.
   * إذا لم يُعثر على مستخدم مطابق، يتم إنشاء مستخدم Overleaf جديد باستخدام البريد الإلكتروني والاسم الأول واسم العائلة المسترجعة من خادم LDAP.

<Danger>
  بالنسبة للمستخدمين الذين يسجّلون الدخول عبر LDAP، لا نخزّن كلمات المرور المجزّأة (hashed) في قاعدة بيانات mongo الخاصة بـ Overleaf (ونحذف الموجود منها).
</Danger>

#### متغيرات البيئة

* `OVERLEAF_LDAP_URL` <strong>(مطلوب)</strong>
  * عنوان URL لخادم LDAP.
    * مثال: `ldaps://ldap.example.com:636` (LDAP عبر SSL)
    * مثال: `ldap://ldap.example.com:389` (غير مشفّر أو STARTTLS، إذا تم إعداده).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * الاسم المعروض لخدمة هوية LDAP، ويُستخدم في صفحة تسجيل الدخول.
  * القيمة الافتراضية `Log in with LDAP Provider`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * سمة البريد الإلكتروني التي يُرجعها خادم LDAP، والقيمة الافتراضية `mail`. يجب أن يكون لكل مستخدم LDAP عنوان بريد إلكتروني واحد على الأقل. وإذا تم توفير عدة عناوين، فسيُستخدم الأول فقط.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * اسم الخاصية التي تحتوي على الاسم الأول للمستخدم والذي يُستخدم في التطبيق، وعادةً ما تكون `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * اسم الخاصية التي تحتوي على اسم عائلة المستخدم والذي يُستخدم في التطبيق، وعادةً ما تكون `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * اسم الخاصية التي تحتوي على الاسم الكامل للمستخدم، وعادةً ما تكون `cn`. إذا لم يتم تعريف أيٍّ من المتغيرين السابقين، يُستخرج الاسم الأول و/أو اسم العائلة للمستخدم من هذا المتغير. وإلا فلا يُستخدم.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * النص النائب (placeholder) لنموذج تسجيل الدخول، والقيمة الافتراضية `Username`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * إذا عُيّن إلى `true`، فسيتم تحديث الحقلين `first_name` و `last_name` لمستخدم LDAP عند تسجيل الدخول، وإيقاف نموذج تفاصيل المستخدم في الصفحة `/user/settings` لمستخدمي LDAP. وإلا فسيتم جلب التفاصيل عند تسجيل الدخول الأول فقط.
* `OVERLEAF_LDAP_BIND_DN`
  * الاسم المميّز (DN) لمستخدم LDAP الذي يجب استخدامه لاتصال LDAP (يجب أن يكون هذا المستخدم قادرًا على البحث في الحسابات وسردها على خادم LDAP)، مثل `cn=ldap_reader,dc=example,dc=com`. إذا لم يتم تعريفه، فسيُستخدم الربط المجهول (anonymous binding).
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * كلمة المرور الخاصة بـ `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * خاصية المستخدم التي يتم الربط بها مقابل العميل، والقيمة الافتراضية `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` <strong>(مطلوب)</strong>
  * الاسم المميّز الأساسي (base DN) الذي يبدأ منه البحث عن المستخدمين. مثل `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * مرشّح بحث LDAP الذي يُستخدم للعثور على المستخدم. استخدم النص الحرفي '\{\{username}}' لإدراج اسم المستخدم المُدخل في بحث LDAP.
    * مثال: `(|(uid={{username}})(mail={{username}}))` (يمكن للمستخدم تسجيل الدخول بالبريد الإلكتروني أو باسم تسجيل الدخول).
    * مثال: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * يمكن أن يكون نطاق البحث `base` أو `one` أو `sub` (الافتراضي).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * مصفوفة JSON من السمات المراد جلبها من خادم LDAP، مثل `["uid", "mail", "givenName", "sn"]`. افتراضيًا، يتم جلب جميع السمات.
* `OVERLEAF_LDAP_STARTTLS`
  * إذا كانت القيمة `true`، فسيُستخدم LDAP عبر TLS.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * مسار الملف الذي يحتوي على شهادة CA المستخدمة للتحقق من شهادة SSL/TLS لخادم LDAP. وإذا كانت هناك عدة شهادات، فيمكن أن يكون مصفوفة JSON من مسارات الشهادات. يجب أن تكون الملفات قابلة للوصول من حاوية docker.
    * مثال (شهادة واحدة): `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * مثال (عدة شهادات): `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * إذا كانت القيمة `true`، فسيتم التحقق من شهادة الخادم مقابل قائمة جهات CA المزوّدة.
* `OVERLEAF_LDAP_CACHE`
  * إذا كانت القيمة `true`، فسيتم تخزين ما يصل إلى 100 من بيانات الاعتماد في الذاكرة المؤقتة لمدة 5 دقائق.
* `OVERLEAF_LDAP_TIMEOUT`
  * المدة التي يسمح فيها العميل باستمرار العمليات قبل انتهاء المهلة، بالمللي ثانية (الافتراضي: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * المدة التي ينتظرها العميل قبل انتهاء مهلة اتصالات TCP، بالمللي ثانية (الافتراضي: القيمة الافتراضية لنظام التشغيل).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` و `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * عند تعيين كلا متغيري البيئة، تقوم عملية تسجيل الدخول بتحديث `user.isAdmin = true` إذا كان ملف تعريف LDAP يحتوي على السمة المحددة في `OVERLEAF_LDAP_IS_ADMIN_ATT` وكانت قيمتها إما مطابقة لـ `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` أو مصفوفة تحتوي على `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`، وإلا فيتم تعيين `user.isAdmin` إلى `false`. وإذا لم يتم تعيين أيٍّ من هذين المتغيرين، فلن تُعيَّن حالة المسؤول إلى `true` إلا أثناء إنشاء المستخدم المسؤول في Launchpad.

تُستخدم المتغيرات الخمسة التالية لإعداد كيفية استرجاع جهات اتصال المستخدم من خادم LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * المرشّح المستخدم للبحث عن المستخدمين في خادم LDAP لتحميلهم في جهات الاتصال. يُستبدل النص النائب '\{\{userProperty}}' داخل المرشّح بقيمة الخاصية المحددة في `OVERLEAF_LDAP_CONTACTS_PROPERTY` لمستخدم LDAP الذي بدأ البحث. وإذا لم يتم تعريفه، فلن يُسترجع أي مستخدم من خادم LDAP إلى جهات الاتصال.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * يحدد الاسم المميّز الأساسي (base DN) الذي يبدأ منه البحث عن جهات الاتصال. والقيمة الافتراضية هي `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * يمكن أن يكون نطاق البحث `base` أو `one` أو `sub` (الافتراضي).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * يحدد خاصية كائن المستخدم التي ستحل محل النص النائب '\{\{userProperty}}' في `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * يحدد قيمة `OVERLEAF_LDAP_CONTACTS_PROPERTY` إذا بدأ البحث مستخدمٌ من غير مستخدمي LDAP. وإذا لم يتم تعريف هذا المتغير، فلن يطابق المرشّح الناتج أي شيء. ويمكن استخدام القيمة `*` كحرف بدل (wildcard).

<Accordion title="مثال">
  ```text theme={null}
  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
  ```

  يؤدي المثال أعلاه إلى تحميل جميع مستخدمي LDAP الذين لديهم نفس قيمة UNIX `gid` في جهات اتصال مستخدم LDAP الحالي. أما المستخدمون من غير مستخدمي LDAP فستحتوي جهات اتصالهم على جميع مستخدمي LDAP الذين لديهم UNIX `gid=1000`.
</Accordion>

<Accordion title="نموذج لملف variables.env">
  ```text theme={null}
  OVERLEAF_APP_NAME="Our Overleaf Instance"

  ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

  # Enables Thumbnail generation using ImageMagick
  ENABLE_CONVERSIONS=true

  # Disables email confirmation requirement
  EMAIL_CONFIRMATION_DISABLED=true

  ## Nginx
  # NGINX_WORKER_PROCESSES=4
  # NGINX_WORKER_CONNECTIONS=768

  ## Set for TLS via nginx-proxy
  # OVERLEAF_BEHIND_PROXY=true
  # OVERLEAF_SECURE_COOKIE=true

  OVERLEAF_SITE_URL=http://my-overleaf-instance.com
  OVERLEAF_NAV_TITLE=Our Overleaf Instance
  # OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
  OVERLEAF_ADMIN_EMAIL=support@example.com

  OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
  OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]

  OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
  OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
  OVERLEAF_EMAIL_SMTP_PORT=587
  OVERLEAF_EMAIL_SMTP_SECURE=false
  # OVERLEAF_EMAIL_SMTP_USER=
  # OVERLEAF_EMAIL_SMTP_PASS=
  # OVERLEAF_EMAIL_SMTP_NAME=
  OVERLEAF_EMAIL_SMTP_LOGGER=false
  OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
  OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
  OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x

  OVERLEAF_PROXY_LEARN=true
  NAV_HIDE_POWERED_BY=true

  #################
  ## LDAP for CE ##
  #################

  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_STARTTLS=true
  OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/var/lib/overleaf/certs/ldap_ca_cert.pem
  OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
  OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
  OVERLEAF_LDAP_LAST_NAME_ATT=sn
  # OVERLEAF_LDAP_NAME_ATT=cn
  OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]

  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true

  OVERLEAF_LDAP_PLACEHOLDER='Username or email address'

  OVERLEAF_LDAP_IS_ADMIN_ATT=mail
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com

  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
  ```
</Accordion>

## دليل خطوة بخطوة: goauthentik

يشرح هذا الدليل إعدادًا تم اختباره مع [goauthentik](https://goauthentik.io/). تستخدم الأمثلة Base DN `dc=example,dc=com`؛ استبدله بالقيمة الخاصة بك.

<Steps>
  <Step title="أنشئ حساب الربط (bind)">
    يسجّل Overleaf الدخول أولًا إلى الدليل بحساب خاص به للعثور على المستخدم. في Authentik، افتح **Directory > Users**، وانقر على **New User**، واختر **Internal User** ثم انقر على **Next**. أدخل اسم مستخدم، على سبيل المثال `ldapservice`، ثم انقر على **Create**:

    <Frame caption="Authentik: إنشاء حساب الربط">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-create.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=bf5d9a5aefd048781339157121a9e203" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-user-create.png" />
    </Frame>

    افتح المستخدم الجديد وانقر على **Set password**. توضع كلمة المرور هذه في `OVERLEAF_LDAP_BIND_CREDENTIALS`:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: تعيين كلمة مرور حساب الربط (نسخة اختبارية)">
        <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-page.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=96aad0f919dc8e74fef5995b1dde1e78" alt="" width="207" data-path="images/on-premises/ldap-authentik-user-page.png" />
      </Frame>
    </div>

    دوّن رقم المستخدم الظاهر في شريط العنوان، على سبيل المثال `19` في `…/#/identity/users/19`. ستحتاج إليه في الخطوة 3.
  </Step>

  <Step title="أنشئ المزوّد والتطبيق">
    افتح **Applications > Applications** وانقر على **New Application**. ينشئ المعالج التطبيق والمزوّد الخاص به معًا.

    1\. امنح التطبيق اسمًا وslug، على سبيل المثال `overleaf-ldap`، ثم انقر على **Next**:

    <Frame caption="Authentik: اسم التطبيق وslug الخاص به">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-app.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=0d3e6b54e9bf552bd81d8b1d6b722701" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-app.png" />
    </Frame>

    2\. اختر **LDAP Provider** ثم انقر على **Next**:

    <Frame caption="Authentik: اختيار مزوّد LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-type.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ee63f2682051572a08c1f5bc321a1af6" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-type.png" />
    </Frame>

    3\. اضبط **Bind Mode** على **Direct binding** و**Search Mode** على **Direct querying**:

    <Frame caption="Authentik: وضع الربط ووضع البحث لمزوّد LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-modes.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ea147f1605e76142021d07f775d5ef53" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-modes.png" />
    </Frame>

    4\. في الأسفل، اضبط **Bind Flow** على `default-authentication-flow` و**Base DN** على Base DN الخاص بك، على سبيل المثال `dc=example,dc=com`:

    <Frame caption="Authentik: تدفق الربط وBase DN لمزوّد LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-basedn.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=4ce418571d83294ee749d56b13c63d44" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-basedn.png" />
    </Frame>

    5\. انقر على **Next** حتى الصفحة الأخيرة ثم أرسل التطبيق.
  </Step>

  <Step title="اسمح لحساب الربط بالبحث في الدليل">
    بدون هذه الصلاحية لا يرى حساب الربط إلا نفسه، فلا يعثر البحث على أي مستخدم ويفشل كل تسجيل دخول عبر LDAP.

    افتح المزوّد، وانتقل إلى **Permissions** وانقر على **Assign Role Object Permission**. في حقل **Role**، اكتب الرقم من الخطوة 1 واختر `ak-managed-role--user-<number>`، ثم فعّل **Search full LDAP directory**:

    <Frame caption="Authentik: منح حساب الربط صلاحية البحث (نسخة اختبارية)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-assign.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=5af53c691ae845adcb4ede42c24fb600" alt="" width="1120" height="529" data-path="images/on-premises/ldap-authentik-assign.png" />
    </Frame>

    بعد ذلك يظهر للدور علامة صح تحت **Search full LDAP directory**:

    <Frame caption="Authentik: صلاحيات مزوّد LDAP (نسخة اختبارية)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-permissions.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=24ae7f0dfb6d19e1b3d6584d6ccf0f0b" alt="" width="990" height="488" data-path="images/on-premises/ldap-authentik-permissions.png" />
    </Frame>
  </Step>

  <Step title="شغّل LDAP outpost">
    يجيب Authentik على طلبات LDAP عبر outpost، وهو حاوية منفصلة. افتح **Applications > Outposts**، وأنشئ outpost من النوع **LDAP** مع المزوّد الخاص بك، ثم انشره كما يوضح Authentik. يستمع على المنفذ 389 للمضيف الذي يعمل عليه. عند اتصاله، تظهر علامة صح خضراء:

    <Frame caption="Authentik: LDAP outpost قيد التشغيل (نسخة اختبارية)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-outposts.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=cd8af2f7df7b2df24d2369416509faef" alt="" width="990" height="468" data-path="images/on-premises/ldap-authentik-outposts.png" />
    </Frame>

    ```dotenv theme={null}
    OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
    ```
  </Step>

  <Step title="املأ قيم DN">
    تعرض صفحة المزوّد Base DN ومثالًا ضمن **How to connect**:

    <Frame caption="Authentik: نظرة عامة على مزوّد LDAP (نسخة اختبارية)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-provider.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=9aa4b747f4c0f51533454a97d835c18c" alt="" width="990" height="773" data-path="images/on-premises/ldap-authentik-provider.png" />
    </Frame>

    لا تنسخ القيم النموذجية كما هي:

    * يعرض **Bind DN** الحساب الذي سجّلت الدخول به. استخدم بدلًا منه حساب الربط من الخطوة 1: `cn=ldapservice,ou=users,<Base DN>`.
    * يعرض **Search base** قيمة Base DN. استخدم `ou=users,<Base DN>`.

    ```dotenv theme={null}
    OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
    OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
    OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
    OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
    ```

    <Warning>
      يحتفظ Authentik بمجموعة تحمل اسم كل مستخدم تحت `ou=virtual-groups`. البحث في كامل Base DN عن `(cn=alice)` يعثر على `cn=alice,ou=users,…` و`cn=alice,ou=virtual-groups,…` معًا، ويرفض Overleaf أي تسجيل دخول يطابق أكثر من إدخال واحد. أبقِ قاعدة البحث على `ou=users,<Base DN>`.
    </Warning>
  </Step>

  <Step title="تحقّق من البحث">
    قبل تشغيل Overleaf، نفّذ البحث نفسه الذي سيجريه. يجب أن يطبع `dn:` واحدًا بالضبط:

    ```shell theme={null}
    ldapsearch -x -H ldap://ldap.example.com:389 \
      -D cn=ldapservice,ou=users,dc=example,dc=com -w '<password of ldapservice>' \
      -b ou=users,dc=example,dc=com '(cn=alice)' dn
    ```

    إذا لم يظهر أي `dn:` على الإطلاق، فهذا يعني عادةً أن الصلاحية من الخطوة 3 مفقودة.
  </Step>

  <Step title="ربط المسؤولين (اختياري)">
    توجد مجموعات المستخدم في `memberOf` على شكل قيم DN تحت `ou=groups`. لجعل أعضاء مجموعة Authentik `Admins` مسؤولين في Overleaf:

    ```dotenv theme={null}
    OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
    OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
    ```

    <Warning>
      يتم تحديث علامة المسؤول عند كل تسجيل دخول عبر LDAP. إذا كانت السمة أو القيمة خاطئة، فسيفقد كل مسؤول يسجّل الدخول عبر LDAP صلاحيات المسؤول. اختبر الربط أولًا بحساب مسؤول ثانٍ.
    </Warning>
  </Step>
</Steps>

<Accordion title="ملف variables.env مُختبَر لـ goauthentik">
  ```dotenv title="variables.env" wrap theme={null}
  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_IDENTITY_SERVICE_NAME=Log in with Authentik
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
  OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_NAME_ATT=name
  OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
  ```
</Accordion>


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