> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/uk/konfiguraciya/overleaf-toolkit/authentication/ldap-authentication.md).

# Автентифікація LDAP

Цю функцію розроблено [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Тут ми пропонуємо деякі документи для вашої конфігурації.

{% hint style="warning" %}
Overleaf використовує **passport-ldapauth** бібліотеку, яка є відносно застарілою, сумісність із LDAP не може бути повністю гарантована. З деякими LDAP-провайдерами ідентичності (наприклад, <https://goauthentik.io/>), можуть виникати збої входу. Тому, якщо можливо, рекомендується спочатку використовувати методи OAuth/SAML.
{% endhint %}

### Що таке LDAP

LDAP — це протокол автентифікації, який використовується для зовнішньої перевірки ідентичності. Overleaf Server Pro надає окрему форму входу LDAP у вебінтерфейсі, відмінну від стандартного методу автентифікації. Коли користувач надсилає своє ім’я користувача та пароль LDAP, бекенд Overleaf перевіряє облікові дані за налаштованим сервером LDAP, наприклад `ldap://ldap:10389`.

<figure><img src="/files/36272aa930fabd681917dd032f4a474309a1d249" alt=""><figcaption><p>Приклад Server Pro для LDAP</p></figcaption></figure>

### Конфігурація

Внутрішньо Overleaf LDAP використовує [passport-ldapauth](https://github.com/vesse/passport-ldapauth) бібліотеку. Більшість із цих параметрів конфігурації передаються до `сервера` об’єкта config, який використовується для налаштування `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 користувач вводить `ім’я користувача` та `пароль` у формі входу, виконується спроба:

1. Користувача LDAP шукають у каталозі LDAP, використовуючи фільтр, визначений `OVERLEAF_LDAP_SEARCH_FILTER` і автентифікують.
2. Якщо автентифікація успішна, в базі даних користувачів Overleaf перевіряють наявність користувача з основною адресою електронної пошти, що збігається з адресою електронної пошти автентифікованого користувача LDAP:
   * Якщо відповідного користувача знайдено, `hashedPassword` поле для цього користувача видаляється (якщо воно існує). Це гарантує, що в майбутньому користувач зможе входити лише через автентифікацію LDAP.
   * Якщо відповідного користувача не знайдено, створюється новий користувач Overleaf з адреси електронної пошти, імені та прізвища, отриманих із сервера LDAP.

{% hint style="danger" %}
Для користувачів, які входять через LDAP, ми не зберігаємо (і не видаляємо наявні) хешовані паролі в Mongo-базі даних Overleaf.
{% endhint %}

#### Змінні середовища

* `OVERLEAF_LDAP_URL` **(обов’язково)**
  * URL сервера LDAP.
    * Приклад: `ldaps://ldap.example.com:636` (LDAP через SSL)
    * Приклад: `ldap://ldap.example.com:389` (незашифровано або STARTTLS, якщо налаштовано).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Відображувана назва служби ідентифікації LDAP, що використовується на сторінці входу.
  * За замовчуванням `Увійти через постачальника LDAP`.
* `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`
  * Заповнювач для форми входу, за замовчуванням `Ім’я користувача`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Якщо встановлено значення `true`, оновлює LDAP-користувача `first_name` та `last_name` поле під час входу, а також вимикає форму з даними користувача на сторінці `/user/settings` для користувачів LDAP. В іншому разі дані буде отримано лише під час першого входу.
* `OVERLEAF_LDAP_BIND_DN`
  * Відмінне ім’я користувача LDAP, яке слід використовувати для підключення до LDAP (цей користувач повинен мати змогу шукати/переглядати облікові записи на сервері LDAP), наприклад, `cn=ldap_reader,dc=example,dc=com`. Якщо не визначено, використовується анонімне прив’язування.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Пароль для `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Властивість користувача, за якою виконується прив’язування до клієнта, за замовчуванням `dn`.
* `OVERLEAF_LDAP_SEARCH_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`, сертифікат сервера перевіряється за списком наданих центрів сертифікації.
* `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`
  * Визначає базовий 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. Якщо цю змінну не визначено, отриманий фільтр не збігатиметься ні з чим. Значення `*` може використовуватися як підстановочний символ.

<details>

<summary><strong>Приклад</strong></summary>

```
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
```

Наведений вище приклад призводить до завантаження в контакти поточного користувача LDAP усіх користувачів LDAP, які мають той самий UNIX `gid`. У користувачів, які не використовують LDAP, у контактах будуть усі користувачі LDAP з UNIX `gid=1000` у їхніх контактах.

</details>

<details>

<summary><strong>Приклад файла variables.env</strong></summary>

```
OVERLEAF_APP_NAME="Our Overleaf Instance"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Увімкнення генерації мініатюр за допомогою ImageMagick
ENABLE_CONVERSIONS=true

# Вимикає вимогу підтвердження електронної пошти
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Установіть для TLS через nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Наш екземпляр Overleaf
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "Звертайтеся до своєї служби підтримки", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Привіт, я праворуч", "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=Ця система керується відділом x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
## LDAP для 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='Ім’я користувача або адреса електронної пошти'

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='*'
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/uk/konfiguraciya/overleaf-toolkit/authentication/ldap-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
