> 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/saml-authentication.md).

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

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

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

Внутрішньо модуль Overleaf SAML використовує [passport-saml](https://github.com/node-saml/passport-saml) бібліотеку, більшість із наведених нижче параметрів конфігурації передаються до `passport-saml`. Якщо у вас виникають проблеми з налаштуванням SAML, варто прочитати README для `passport-saml` щоб зрозуміти, яку конфігурацію він очікує.

Змінна середовища `EXTERNAL_AUTH` потрібна для ввімкнення модуля автентифікації SAML. Ця змінна середовища вказує, які зовнішні методи автентифікації активовано. Значення цієї змінної — це список. Якщо список містить `saml` то автентифікацію SAML буде активовано.

Наприклад: `EXTERNAL_AUTH=ldap saml`

Під час використання методу автентифікації SAML користувача перенаправляють на сайт автентифікації постачальника ідентичності (IdP). Якщо IdP успішно автентифікує користувача, у базі даних користувачів Overleaf перевіряється запис, що містить `samlIdentifiers` поле, структуроване так:

```json
samlIdentifiers: [
  {
    externalUserId: "...",
    providerId: "1",
    userIdAttribute: "..."
  }
]
```

Поле `externalUserId` має збігатися зі значенням властивості, вказаної за допомогою `userIdAttribute` у профілі користувача, повернутому сервером IdP.

Якщо відповідного запису не знайдено, у базі даних шукається користувач із основною адресою електронної пошти, що збігається з email у профілі користувача IdP:

* Якщо такого користувача знайдено, `hashedPassword` поле видаляється, щоб вимкнути локальну автентифікацію, і `samlIdentifiers` поле додається.
* Якщо відповідного користувача не знайдено, створюється новий користувач з адресою електронної пошти та `samlIdentifiers` з профілю IdP.

**Примітка:** Наразі підтримується лише один SAML IdP. Поле `providerId` поле в `samlIdentifiers` зафіксовано на `'1'`.

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

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Відображувана назва служби ідентифікації, використовується на сторінці входу (за замовчуванням: `Увійти через SAML IdP`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * Значення цього атрибута буде використано Overleaf як зовнішній ідентифікатор користувача, за замовчуванням `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * Назва поля Email у профілі користувача, за замовчуванням `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * Назва поля firstName у профілі користувача, за замовчуванням `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * Назва поля lastName у профілі користувача, за замовчуванням `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * Якщо встановлено у `true`, оновлює поле користувача `first_name` та `last_name` поле під час входу та вимкнути форму даних користувача на `/user/settings` сторінці.
* `OVERLEAF_SAML_ENTRYPOINT` **(обов’язково)**
  * URL входу для служби ідентичності SAML.
    * Приклад: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * Приклад Azure: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(обов’язково)**
  * Назва видавця.
* `OVERLEAF_SAML_AUDIENCE`
  * Очікувана аудиторія відповіді SAML, за замовчуванням значення `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(обов’язково)**
  * Шлях до файла, що містить публічний сертифікат постачальника ідентичності, який використовується для перевірки підписів вхідних відповідей SAML. Якщо постачальник ідентичності має кілька дійсних сертифікатів підпису, це може бути JSON-масив шляхів до сертифікатів.
    * Приклад (один сертифікат): `/var/lib/overleaf/certs/idp_cert.pem`
    * Приклад (кілька сертифікатів): `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * Шлях до файла, що містить публічний сертифікат підпису, який вбудовується в запити автентифікації, щоб IdP міг перевірити підписи вхідного SAML-запиту. Це потрібно під час налаштування [кінцевої точки метаданих](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) коли стратегія налаштована з `OVERLEAF_SAML_PRIVATE_KEY`. Для підтримки ротації сертифікатів можна надати JSON-масив шляхів до сертифікатів. Під час передавання масиву сертифікатів перший елемент масиву має відповідати поточному `OVERLEAF_SAML_PRIVATE_KEY`. Додаткові елементи масиву можна використовувати, щоб оприлюднювати майбутні сертифікати для IdP перед зміною `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * Шлях до файла, що містить приватний ключ у форматі PEM, який відповідає `OVERLEAF_SAML_PUBLIC_CERT` який використовується для підписання запитів автентифікації, надісланих passport-saml.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * Шлях до файла, що містить публічний сертифікат, який використовується для [кінцевої точки метаданих](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * Шлях до файла, що містить приватний ключ, який відповідає `OVERLEAF_SAML_DECRYPTION_CERT` , що використовуватиметься для спроб розшифрування всіх отриманих зашифрованих тверджень.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * За бажанням можна встановити алгоритм підпису для підписання запитів; допустимі значення: 'sha1' (за замовчуванням), 'sha256' (кращий вибір), 'sha512' (найбезпечніший, перевірте, чи підтримує його ваш IdP).
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * JSON-словник додаткових параметрів запиту, які слід додати до всіх запитів.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * JSON-словник додаткових параметрів запиту, які слід додати до запитів 'authorize'.
    * Приклад: `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * Формат ідентифікатора імені, який слід запросити у постачальника ідентичності (за замовчуванням: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). Якщо використовується `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, переконайтеся, що `OVERLEAF_SAML_EMAIL_FIELD` змінну середовища визначено. Якщо `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` є обов'язковим, ви також маєте визначити `OVERLEAF_SAML_ID_FIELD` змінну середовища, яку, наприклад, можна встановити як адресу електронної пошти користувача.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * Проміжок часу в мілісекундах допустимого зсуву між клієнтом і сервером під час перевірки часових міток чинності умов твердження OnBefore і NotOnOrAfter. Якщо встановити -1, перевірка цих умов буде повністю вимкнена. Типове значення — 0.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` атрибут, який потрібно додати до AuthnRequest, щоб вказати IdP, який набір атрибутів прикріпити до відповіді ([посилання](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * JSON-масив значень формату ідентифікатора імені для запиту контексту автентифікації. За замовчуванням: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * Якщо `true`, початковий SAML-запит від постачальника послуг указує, що IdP має примусово повторно автентифікувати користувача, навіть якщо у нього є дійсний сеанс.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * Якщо `true`, не запитуйте конкретний контекст автентифікації. Наприклад, ви можете встановити це `true` щоб дозволити додаткові контексти, такі як входи без пароля (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). Підтримка додаткових контекстів залежить від вашого IdP.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * Якщо встановлено у `HTTP-POST`, буде запитувати автентифікацію в IdP через прив'язку HTTP POST, інакше за замовчуванням використовується HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * Якщо `always`, тоді InResponseTo буде перевірено у вхідних відповідях SAML.
  * Якщо `ніколи`, тоді InResponseTo не перевірятиметься (за замовчуванням).
  * Якщо `ifPresent`, тоді InResponseTo перевірятиметься лише якщо він присутній у вхідній відповіді SAML.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` та `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * Коли встановлено у `true` (за замовчуванням), Overleaf очікує, що твердження SAML, а саме вся відповідь автентифікації SAML, будуть підписані IdP. Коли обидва параметри `false`, принаймні одне з тверджень або відповідь мають бути підписані.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * Визначає час закінчення дії, коли Request ID, згенерований для запиту SAML, не буде дійсним, якщо його побачено у відповіді SAML у полі `InResponseTo` Поле. За замовчуванням: 28800000 (8 годин).
* `OVERLEAF_SAML_LOGOUT_URL`
  * базова адреса для виклику запитів виходу з системи (за замовчуванням: `entryPoint`).
    * Приклад: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * JSON-словник додаткових параметрів запиту, які слід додати до запитів 'logout'.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` та `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * Коли обидві змінні середовища встановлено, процес входу оновлює `user.isAdmin = true` якщо профіль, повернутий SAML IdP, містить атрибут, вказаний за допомогою `OVERLEAF_SAML_IS_ADMIN_FIELD` і його значення або збігається з `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` або є масивом, що містить `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`, інакше `user.isAdmin` встановлюється в `false`. Якщо будь-яку з цих змінних не встановлено, тоді статус адміністратора встановлюється лише `true` під час створення адміністратора в Launchpad.

**Метадані для постачальника ідентичності**

Поточна версія Overleaf CE включає кінцеву точку для отримання метаданих постачальника послуг: `http://my-overleaf-instance.com/saml/meta`

Постачальника ідентичності потрібно налаштувати так, щоб він розпізнавав сервер Overleaf як "постачальника послуг". Зверніться до документації вашого SAML-сервера, щоб дізнатися, як це зробити.

Нижче наведено приклад відповідних метаданих постачальника послуг:

<details>

<summary><strong>ol-meta.xml</strong></summary>

```
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                  entityID="MyOverleaf"
                  ID="_b508c83b7dda452f5b269383fb391107116f8f57">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" WantAssertionsSigned="true">
    <KeyDescriptor use="signing">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[пропущено]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[пропущено]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes256-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes128-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                         Location="https://my-overleaf-instance.com/saml/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1"
                              isDefault="true"
                              Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                              Location="https://my-overleaf-instance.com/saml/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

```

</details>

Зверніть увагу на сертифікати, `AssertionConsumerService.Location`, `SingleLogoutService.Location` та `EntityDescriptor.entityID` і встановіть їх відповідно у вашій конфігурації IdP або надішліть файл метаданих адміністратору IdP.

<details>

<summary><strong>Приклад файла variables.env (мінімальний)</strong></summary>

<pre><code>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

#################
##     SAML    ##
#################

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Увійти через SAML-провайдера'
OVERLEAF_SAML_EMAIL_FIELD=Email
OVERLEAF_SAML_FIRST_NAME_FIELD=DisplayName
OVERLEAF_SAML_LAST_NAME_FIELD=DisplayName
OVERLEAF_SAML_ENTRYPOINT=http://localhost:18000/login/saml/authorize/admin/SAML_Overleaf
<strong>OVERLEAF_SAML_IDP_CERT=/var/lib/overleaf/certs/idp_cert.pem
</strong>OVERLEAF_SAML_SIGNATURE_ALGORITHM=
</code></pre>

</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/saml-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.
