> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-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>Приклад LDAP для Server Pro</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 із email, іменем та прізвищем, отриманими із сервера 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`
  * Атрибут email, що повертається сервером 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}}))` (користувач може увійти за email або за логіном).
    * Приклад: `(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`
  * Вказує базовий 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="Наш екземпляр Overleaf"

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://ayakaleaf-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.
