> 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/ru/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 пользователь перенаправляется на сайт аутентификации поставщика удостоверений (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 как внешний идентификатор пользователя, по умолчанию `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="Our Overleaf Instance"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Включает генерацию миниатюр с помощью ImageMagick
ENABLE_CONVERSIONS=true

# Отключает требование подтверждения email
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://ayakaleaf-pro.ayaka.space/on-premises/ru/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.
