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

Если совпадающая запись не найдена, в базе данных выполняется поиск пользователя с основным адресом электронной почты, совпадающим с 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`
  * Если `всегда`, тогда InResponseTo будет проверяться во входящих SAML-ответах.
  * Если `никогда`, тогда InResponseTo не будет проверяться (по умолчанию).
  * Если `если присутствует`, тогда 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://overleaf-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.
