> 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/es/configuracion/overleaf-toolkit/authentication/saml-authentication.md).

# Autenticación SAML

Esta función fue desarrollada por [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Aquí ofrecemos algunos documentos para su configuración.

### Configuración

Internamente, el módulo SAML de Overleaf utiliza la [passport-saml](https://github.com/node-saml/passport-saml) biblioteca, la mayoría de las siguientes opciones de configuración se pasan a `passport-saml`. Si tienes problemas al configurar SAML, vale la pena leer el README de `passport-saml` para hacerse una idea de la configuración que espera.

La variable de entorno `EXTERNAL_AUTH` se requiere para habilitar el módulo de autenticación SAML. Esta variable de entorno especifica qué métodos de autenticación externos están activados. El valor de esta variable es una lista. Si la lista incluye `saml` entonces se activará la autenticación SAML.

Por ejemplo: `EXTERNAL_AUTH=ldap saml`

Al usar el método de autenticación SAML, se redirige a un usuario al sitio de autenticación del Proveedor de Identidad (IdP). Si el IdP autentica correctamente al usuario, se comprueba en la base de datos de usuarios de Overleaf si existe un registro que contenga un `samlIdentifiers` campo estructurado de la siguiente manera:

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

La `externalUserId` debe coincidir con el valor de la propiedad especificada por `userIdAttribute` en el perfil de usuario devuelto por el servidor IdP.

Si no se encuentra ningún registro coincidente, se busca en la base de datos un usuario cuya dirección de correo principal coincida con el correo del perfil de usuario del IdP:

* Si se encuentra un usuario así, el `hashedPassword` el campo se elimina para deshabilitar la autenticación local, y el `samlIdentifiers` campo se agrega.
* Si no se encuentra ningún usuario coincidente, se crea un usuario nuevo con la dirección de correo electrónico y `samlIdentifiers` del perfil del IdP.

**Nota:** Actualmente, solo se admite un IdP SAML. El `providerId` campo en `samlIdentifiers` se fija en `'1'`.

#### Variables de entorno

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Nombre visible del servicio de identidad, usado en la página de inicio de sesión (por defecto: `Iniciar sesión con IdP SAML`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * El valor de este atributo será usado por Overleaf como el ID de usuario externo, por defecto `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * Nombre del campo de correo electrónico en el perfil de usuario, el valor predeterminado es `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * Nombre del campo firstName en el perfil de usuario, el valor predeterminado es `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * Nombre del campo lastName en el perfil de usuario, el valor predeterminado es `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * Si se establece en `true`, actualiza el `first_name` y `last_name` campo al iniciar sesión, y desactiva el formulario de detalles del usuario en `/user/settings` .
* `OVERLEAF_SAML_ENTRYPOINT` **(obligatorio)**
  * URL del punto de entrada para el servicio de identidad SAML.
    * Ejemplo: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * Ejemplo de Azure: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(obligatorio)**
  * El nombre del emisor.
* `OVERLEAF_SAML_AUDIENCE`
  * Audiencia esperada de la respuesta SAML, el valor predeterminado es `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(obligatorio)**
  * Ruta a un archivo que contiene el certificado público del Proveedor de Identidad, utilizado para validar las firmas de las respuestas SAML entrantes. Si el Proveedor de Identidad tiene varios certificados de firma válidos, puede ser un array JSON de rutas a los certificados.
    * Ejemplo (un certificado): `/var/lib/overleaf/certs/idp_cert.pem`
    * Ejemplo (varios certificados): `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * Ruta a un archivo que contiene el certificado público de firma, utilizado para incrustarlo en las solicitudes de autenticación para que el IdP pueda validar las firmas de la Solicitud SAML entrante. Se requiere al configurar el [endpoint de metadatos](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) cuando la estrategia se configura con un `OVERLEAF_SAML_PRIVATE_KEY`. Se puede proporcionar un array JSON de rutas a certificados para admitir la rotación de certificados. Cuando se suministra un array de certificados, la primera entrada del array debe coincidir con el `OVERLEAF_SAML_PRIVATE_KEY`. Las entradas adicionales del array pueden usarse para publicar certificados próximos a los IdP antes de cambiar el `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * Ruta a un archivo que contiene una clave privada con formato PEM que coincide con el `OVERLEAF_SAML_PUBLIC_CERT` utilizada para firmar las solicitudes de autenticación enviadas por passport-saml.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * Ruta a un archivo que contiene el certificado público, utilizado para la [endpoint de metadatos](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * Ruta a un archivo que contiene la clave privada que coincide con la `OVERLEAF_SAML_DECRYPTION_CERT` que se utilizará para intentar descifrar cualquier aserción cifrada que se reciba.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * Opcionalmente establece el algoritmo de firma para firmar las solicitudes; los valores válidos son 'sha1' (predeterminado), 'sha256' (preferido), 'sha512' (más seguro, comprueba si tu IdP lo admite).
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * Diccionario JSON de parámetros de consulta adicionales para añadir a todas las solicitudes.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * Diccionario JSON de parámetros de consulta adicionales para añadir a las solicitudes de 'authorize'.
    * Ejemplo: `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * Formato del identificador de nombre a solicitar al proveedor de identidad (predeterminado: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). Si se usa `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, asegúrate de que la `OVERLEAF_SAML_EMAIL_FIELD` variable de entorno esté definida. Si `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` es necesario, también debes definir la `OVERLEAF_SAML_ID_FIELD` variable de entorno, que por ejemplo puede establecerse en la dirección de correo electrónico del usuario.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * Tiempo en milisegundos de desviación aceptable entre cliente y servidor al comprobar la validez de las marcas de tiempo de las condiciones de aserción OnBefore y NotOnOrAfter. Establecerlo en -1 deshabilitará por completo la comprobación de estas condiciones. El valor predeterminado es 0.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` atributo que se añade a AuthnRequest para indicar al IdP qué conjunto de atributos debe adjuntarse a la respuesta ([enlace](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * Array JSON de valores de formato de identificador de nombre para solicitar el contexto de autenticación. Predeterminado: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * Si `true`, la solicitud SAML inicial del proveedor de servicios especifica que el IdP debe forzar la reautenticación del usuario, incluso si posee una sesión válida.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * Si `true`, no solicites un contexto de autenticación específico. Por ejemplo, puedes establecer esto en `true` para permitir contextos adicionales como inicios de sesión sin contraseña (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). La compatibilidad con contextos adicionales depende de tu IdP.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * Si se establece en `HTTP-POST`, solicitará autenticación al IdP mediante enlace HTTP POST; de lo contrario, el valor predeterminado es HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * Si `always`, entonces InResponseTo se validará en las respuestas SAML entrantes.
  * Si `nunca`, entonces InResponseTo no se validará (predeterminado).
  * Si `ifPresent`, entonces InResponseTo solo se validará si está presente en la respuesta SAML entrante.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` y `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * Cuando se establece en `true` (predeterminado), Overleaf espera que las Aserciones SAML, respectivamente toda la Respuesta de Autenticación SAML, estén firmadas por el IdP. Cuando ambas opciones están `false`, al menos una de las aserciones o la respuesta debe estar firmada.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * Define el tiempo de expiración durante el cual un Request ID generado para una solicitud SAML no será válido si se ve en una respuesta SAML en el campo `InResponseTo` predeterminado: 28800000 (8 horas).
* `OVERLEAF_SAML_LOGOUT_URL`
  * dirección base a la que llamar con solicitudes de cierre de sesión (predeterminado: `entryPoint`).
    * Ejemplo: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * Diccionario JSON de parámetros de consulta adicionales para añadir a las solicitudes de 'logout'.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` y `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * Cuando ambas variables de entorno están configuradas, el proceso de inicio de sesión actualiza `user.isAdmin = true` si el perfil devuelto por el IdP SAML contiene el atributo especificado por `OVERLEAF_SAML_IS_ADMIN_FIELD` y su valor coincide con `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` o es una matriz que contiene `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`, de lo contrario `user.isAdmin` se establece en `false`. Si alguna de estas variables no está configurada, entonces el estado de administrador solo se establece en `true` durante la creación del usuario administrador en Launchpad.

**Metadatos del Proveedor de Identidad**

La versión actual de Overleaf CE incluye un endpoint para recuperar los metadatos del Proveedor de Servicios: `http://my-overleaf-instance.com/saml/meta`

El Proveedor de Identidad deberá configurarse para reconocer el servidor Overleaf como un "Proveedor de Servicios". Consulta la documentación de tu servidor SAML para obtener instrucciones sobre cómo hacerlo.

A continuación se muestra un ejemplo de metadatos apropiados del Proveedor de Servicios:

<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...
[omitido]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[omitido]
</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>

Tenga en cuenta los certificados, `AssertionConsumerService.Location`, `SingleLogoutService.Location` y `EntityDescriptor.entityID` y configúrelo según corresponda en la configuración de tu IdP, o envía el archivo de metadatos al administrador del IdP.

<details>

<summary><strong>Archivo de ejemplo variables.env (mínimo)</strong></summary>

<pre><code>OVERLEAF_APP_NAME="Nuestra instancia de Overleaf"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Habilita la generación de miniaturas usando ImageMagick
ENABLE_CONVERSIONS=true

# Desactiva el requisito de confirmación por correo electrónico
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Establecer para TLS mediante nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "Contacte a su equipo de soporte", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Hola, estoy a la derecha", "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=Este sistema es administrado por el departamento x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

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

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Iniciar sesión con proveedor 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/es/configuracion/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.
