> 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/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 transfieren a `passport-saml`. Si tienes problemas para 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` es necesario 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 al 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: "..."
  }
]
```

El `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 un 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` campo se elimina para deshabilitar la autenticación local, y el `samlIdentifiers` campo se añade.
* Si no se encuentra ningún usuario que coincida, se crea un nuevo usuario 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` está fijado a `'1'`.

#### Variables de entorno

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Nombre para mostrar del servicio de identidad, usado en la página de inicio de sesión (predeterminado: `Iniciar sesión con IdP SAML`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * El valor de este atributo será utilizado por Overleaf como ID de usuario externo, por defecto `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * Nombre del campo Email en el perfil de usuario, por defecto `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * Nombre del campo firstName en el perfil de usuario, por defecto `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * Nombre del campo lastName en el perfil de usuario, por defecto `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * Si se establece en `true`, actualiza el usuario `first_name` y `last_name` campo al iniciar sesión, y desactiva el formulario de detalles del usuario en `/user/settings` página.
* `OVERLEAF_SAML_ENTRYPOINT` **(obligatorio)**
  * URL de entrada del 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)**
  * Nombre del emisor.
* `OVERLEAF_SAML_AUDIENCE`
  * Audiencia esperada de la respuesta SAML, por defecto el valor de `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, entonces 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 incrustar en las solicitudes de autenticación, de modo que el IdP pueda validar las firmas de la solicitud SAML entrante. Es necesario al configurar el [punto final 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. Al proporcionar un array de certificados, la primera entrada del array debe coincidir con el certificado actual `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 coincida con la `OVERLEAF_SAML_PUBLIC_CERT` utilizada para firmar 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 [punto final 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 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 que se solicitará al proveedor de identidad (predeterminado: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). Si usas `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`
  * Desfase aceptable, en milisegundos, entre cliente y servidor al comprobar las marcas de tiempo de validez de las condiciones de aserción OnBefore y NotOnOrAfter. Establecerlo en -1 desactivará 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 adjuntar 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 del 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á la 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 en el que un ID de solicitud generado para una solicitud SAML no será válido si aparece en una respuesta SAML en el `InResponseTo` 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 definidas, 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 un arreglo que contiene `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`, en caso contrario `user.isAdmin` se establece en `false`. Si alguna de estas variables no está definida, entonces el estado de administrador solo se establece en `true` durante la creación de usuarios administradores en Launchpad.

**Metadatos para el Proveedor de Identidad**

La versión actual de Overleaf CE incluye un punto final 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 de 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...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</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>

Observa los certificados, `AssertionConsumerService.Location`, `SingleLogoutService.Location` y `EntityDescriptor.entityID` y configúralos según corresponda en tu configuración del 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 a través de nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Nuestra instancia de Overleaf
# 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=Correo electrónico
OVERLEAF_SAML_FIRST_NAME_FIELD=Nombre para mostrar
OVERLEAF_SAML_LAST_NAME_FIELD=Nombre para mostrar
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/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.
