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

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

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

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

Внутрішньо модуль SAML Overleaf використовує [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 користувача перенаправляють на сайт автентифікації Identity Provider (IdP). Якщо IdP успішно автентифікує користувача, в базі даних користувачів Overleaf перевіряється запис, що містить `samlIdentifiers` поле, структуроване так:

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

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

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

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

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

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

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Відображувана назва служби ідентифікації, що використовується на сторінці входу (за замовчуванням: `Увійти через SAML IdP`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * Значення цього атрибута Overleaf використовуватиме як зовнішній ID користувача, за замовчуванням `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`
  * Очікувана Audience SAML-відповіді, за замовчуванням дорівнює значенню `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(обов’язково)**
  * Шлях до файлу, що містить публічний сертифікат Identity Provider, який використовується для перевірки підписів вхідних SAML-відповідей. Якщо Identity Provider має кілька дійсних сертифікатів підпису, тоді це може бути 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 як "Service Provider". Зверніться до документації вашого 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="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

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

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Log in with SAML Provider'
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://overleaf-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.
