> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Autenticación LDAP

<Info>
  Esta funcionalidad ha sido desarrollada por [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Aquí ofrecemos documentación para tu configuración.
</Info>

<Warning>
  Overleaf utiliza la biblioteca **passport-ldapauth**, que está relativamente desactualizada, por lo que no se puede garantizar plenamente la compatibilidad con LDAP. Con ciertos proveedores de identidad LDAP (por ejemplo, [https://goauthentik.io/](https://goauthentik.io/)), pueden producirse fallos de inicio de sesión. Por ello, si es posible, se recomienda usar antes el método OAuth/SAML. Para goauthentik, sigue la guía [Paso a paso: goauthentik](/es/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication#paso-a-paso-goauthentik) que encontrarás más abajo, ya que está probada.
</Warning>

### Qué es LDAP

LDAP es un protocolo de autenticación utilizado para la verificación de identidad externa. Overleaf Server Pro ofrece un formulario de inicio de sesión LDAP dedicado en la interfaz web, separado del método de autenticación estándar. Cuando un usuario envía su nombre de usuario y contraseña de LDAP, el backend de Overleaf verifica las credenciales contra el servidor LDAP configurado, por ejemplo `ldap://ldap:10389`.

<Frame caption="Un ejemplo de LDAP en Server Pro">
  <img src="https://mintcdn.com/ayakaleaf-pro/x9kfDjtWlyyhG_mR/images/on-premises/image-29.png?fit=max&auto=format&n=x9kfDjtWlyyhG_mR&q=85&s=f3ebcacecec45115cf9b1fa55eb1ba94" alt="" width="2804" height="2005" data-path="images/on-premises/image-29.png" />
</Frame>

### Configuración

Internamente, el LDAP de Overleaf utiliza la biblioteca [passport-ldapauth](https://github.com/vesse/passport-ldapauth). La mayoría de estas opciones de configuración se pasan al objeto de configuración `server`, que se usa para configurar `passport-ldapauth`. Si tienes problemas al configurar LDAP, vale la pena leer el README de `passport-ldapauth` para hacerte una idea de la configuración que espera.

La variable de entorno `EXTERNAL_AUTH` es necesaria para habilitar el módulo de autenticación LDAP. Esta variable de entorno especifica qué métodos de autenticación externa se activan. El valor de esta variable es una lista. Si la lista incluye `ldap`, se activará la autenticación LDAP.

Por ejemplo: `EXTERNAL_AUTH=ldap saml`

A diferencia de Overleaf CEP, en nuestra edición ayaka-notes limitamos la autenticación LDAP a un método de autenticación puro, disponible en `http://your-overleaf.com/ldap/login`.

Al usar los métodos de autenticación LDAP, cuando un usuario introduce un `username` y una `password` en el formulario de inicio de sesión, se intenta lo siguiente:

1. Se busca un usuario LDAP en el directorio LDAP usando el filtro definido por `OVERLEAF_LDAP_SEARCH_FILTER` y se autentica.
2. Si la autenticación tiene éxito, se busca en la base de datos de usuarios de Overleaf un usuario cuya dirección de correo principal coincida con la dirección de correo del usuario LDAP autenticado:
   * Si se encuentra un usuario coincidente, se elimina el campo `hashedPassword` de este usuario (si existe). Esto garantiza que, en el futuro, el usuario solo pueda iniciar sesión mediante autenticación LDAP.
   * Si no se encuentra ningún usuario coincidente, se crea un nuevo usuario de Overleaf con el correo, el nombre y los apellidos obtenidos del servidor LDAP.

<Danger>
  Para los usuarios que inician sesión mediante LDAP, no almacenamos contraseñas cifradas (hash) en la base de datos mongo de Overleaf (o eliminamos las existentes).
</Danger>

#### Variables de entorno

* `OVERLEAF_LDAP_URL` <strong>(obligatoria)</strong>
  * URL del servidor LDAP.
    * Ejemplo: `ldaps://ldap.example.com:636` (LDAP sobre SSL)
    * Ejemplo: `ldap://ldap.example.com:389` (sin cifrar o STARTTLS, si está configurado).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Nombre visible del servicio de identidad LDAP, usado en la página de inicio de sesión.
  * Por defecto, `Log in with LDAP Provider`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * El atributo de correo devuelto por el servidor LDAP; por defecto `mail`. Cada usuario LDAP debe tener al menos una dirección de correo. Si se proporcionan varias direcciones, solo se usará la primera.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * El nombre de la propiedad que contiene el nombre del usuario que se usa en la aplicación, normalmente `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * El nombre de la propiedad que contiene el apellido del usuario que se usa en la aplicación, normalmente `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * El nombre de la propiedad que contiene el nombre completo del usuario, normalmente `cn`. Si alguna de las dos variables anteriores no está definida, el nombre y/o el apellido del usuario se extraen de esta variable. En caso contrario, no se usa.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * El texto de marcador de posición del formulario de inicio de sesión; por defecto `Username`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Si se establece en `true`, actualiza los campos `first_name` y `last_name` del usuario LDAP al iniciar sesión y desactiva el formulario de datos del usuario en la página `/user/settings` para los usuarios LDAP. En caso contrario, los datos solo se obtendrán en el primer inicio de sesión.
* `OVERLEAF_LDAP_BIND_DN`
  * El nombre distintivo del usuario LDAP que debe usarse para la conexión LDAP (este usuario debe poder buscar/listar cuentas en el servidor LDAP), p. ej., `cn=ldap_reader,dc=example,dc=com`. Si no se define, se usa un enlace (bind) anónimo.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Contraseña de `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Propiedad del usuario con la que se realiza el bind contra el cliente; por defecto `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` <strong>(obligatoria)</strong>
  * El DN base a partir del cual buscar usuarios. P. ej., `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * Filtro de búsqueda LDAP con el que encontrar un usuario. Usa el literal '\{\{username}}' para que el nombre de usuario indicado se interpole en la búsqueda LDAP.
    * Ejemplo: `(|(uid={{username}})(mail={{username}}))` (el usuario puede iniciar sesión con su correo o con su nombre de inicio de sesión).
    * Ejemplo: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * El ámbito de la búsqueda puede ser `base`, `one` o `sub` (por defecto).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * Array JSON de atributos que se obtienen del servidor LDAP, p. ej., `["uid", "mail", "givenName", "sn"]`. Por defecto se obtienen todos los atributos.
* `OVERLEAF_LDAP_STARTTLS`
  * Si es `true`, se usa LDAP sobre TLS.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * Ruta al archivo que contiene el certificado de la CA usado para verificar el certificado SSL/TLS del servidor LDAP. Si hay varios certificados, puede ser un array JSON de rutas a los certificados. Los archivos deben ser accesibles para el contenedor Docker.
    * Ejemplo (un certificado): `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * Ejemplo (varios certificados): `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * Si es `true`, el certificado del servidor se verifica contra la lista de CA proporcionadas.
* `OVERLEAF_LDAP_CACHE`
  * Si es `true`, se almacenarán en caché hasta 100 credenciales a la vez durante 5 minutos.
* `OVERLEAF_LDAP_TIMEOUT`
  * Cuánto tiempo debe dejar el cliente que duren las operaciones antes de agotar el tiempo de espera, en ms (por defecto: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * Cuánto tiempo debe esperar el cliente antes de agotar el tiempo de espera en las conexiones TCP, en ms (por defecto: el valor predeterminado del sistema operativo).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` y `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * Cuando ambas variables de entorno están definidas, el proceso de inicio de sesión establece `user.isAdmin = true` si el perfil LDAP contiene el atributo especificado por `OVERLEAF_LDAP_IS_ADMIN_ATT` y su valor coincide con `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` o es un array que contiene `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`; en caso contrario, `user.isAdmin` se establece en `false`. Si alguna de estas variables no está definida, el estado de administrador solo se establece en `true` durante la creación del usuario administrador en Launchpad.

Las siguientes cinco variables se usan para configurar cómo se obtienen los contactos de los usuarios desde el servidor LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * El filtro usado para buscar en el servidor LDAP los usuarios que se cargarán en los contactos. El marcador '\{\{userProperty}}' dentro del filtro se sustituye por el valor de la propiedad especificada por `OVERLEAF_LDAP_CONTACTS_PROPERTY` del usuario LDAP que inicia la búsqueda. Si no se define, no se cargan usuarios del servidor LDAP en los contactos.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * Especifica el DN base desde el que empezar a buscar los contactos. Por defecto, `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * El ámbito de la búsqueda puede ser `base`, `one` o `sub` (por defecto).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * Especifica la propiedad del objeto de usuario que sustituirá al marcador '\{\{userProperty}}' en `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * Especifica el valor de `OVERLEAF_LDAP_CONTACTS_PROPERTY` si la búsqueda la inicia un usuario que no es LDAP. Si esta variable no está definida, el filtro resultante no coincidirá con nada. El valor `*` puede usarse como comodín.

<Accordion title="Ejemplo">
  ```text theme={null}
  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
  ```

  El ejemplo anterior carga en los contactos del usuario LDAP actual a todos los usuarios LDAP que tienen el mismo `gid` de UNIX. Los usuarios que no son LDAP tendrán en sus contactos a todos los usuarios LDAP con `gid=1000` de UNIX.
</Accordion>

<Accordion title="Archivo variables.env de ejemplo">
  ```text theme={null}
  OVERLEAF_APP_NAME="Our Overleaf Instance"

  ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

  # Enables Thumbnail generation using ImageMagick
  ENABLE_CONVERSIONS=true

  # Disables email confirmation requirement
  EMAIL_CONFIRMATION_DISABLED=true

  ## Nginx
  # NGINX_WORKER_PROCESSES=4
  # NGINX_WORKER_CONNECTIONS=768

  ## Set for TLS via 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": "Contact your support team", "url": "mailto:support@example.com"}]
  OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "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=This system is run by department x

  OVERLEAF_PROXY_LEARN=true
  NAV_HIDE_POWERED_BY=true

  #################
  ## LDAP for CE ##
  #################

  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_STARTTLS=true
  OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/var/lib/overleaf/certs/ldap_ca_cert.pem
  OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
  OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
  OVERLEAF_LDAP_LAST_NAME_ATT=sn
  # OVERLEAF_LDAP_NAME_ATT=cn
  OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]

  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true

  OVERLEAF_LDAP_PLACEHOLDER='Username or email address'

  OVERLEAF_LDAP_IS_ADMIN_ATT=mail
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com

  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
  ```
</Accordion>

## Paso a paso: goauthentik

Esta guía describe una configuración probada con [goauthentik](https://goauthentik.io/). Los ejemplos usan el Base DN `dc=example,dc=com`; sustitúyelo por el tuyo.

<Steps>
  <Step title="Crear una cuenta de enlace (bind)">
    Overleaf inicia sesión primero en el directorio con una cuenta propia para encontrar al usuario. En Authentik, abre **Directory > Users**, haz clic en **New User**, elige **Internal User** y haz clic en **Next**. Introduce un nombre de usuario, por ejemplo `ldapservice`, y haz clic en **Create**:

    <Frame caption="Authentik: crear la cuenta de enlace">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-create.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=bf5d9a5aefd048781339157121a9e203" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-user-create.png" />
    </Frame>

    Abre el nuevo usuario y haz clic en **Set password**. Esta contraseña va en `OVERLEAF_LDAP_BIND_CREDENTIALS`:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: establecer la contraseña de la cuenta de enlace (instancia de prueba)">
        <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-page.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=96aad0f919dc8e74fef5995b1dde1e78" alt="" width="207" data-path="images/on-premises/ldap-authentik-user-page.png" />
      </Frame>
    </div>

    Anota el número del usuario que aparece en la barra de direcciones, por ejemplo `19` en `…/#/identity/users/19`. Lo necesitarás en el paso 3.
  </Step>

  <Step title="Crear el proveedor y la aplicación">
    Abre **Applications > Applications** y haz clic en **New Application**. El asistente crea la aplicación y su proveedor a la vez.

    1\. Asigna a la aplicación un nombre y un slug, por ejemplo `overleaf-ldap`, y haz clic en **Next**:

    <Frame caption="Authentik: nombre y slug de la aplicación">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-app.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=0d3e6b54e9bf552bd81d8b1d6b722701" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-app.png" />
    </Frame>

    2\. Elige **LDAP Provider** y haz clic en **Next**:

    <Frame caption="Authentik: elegir el proveedor LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-type.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ee63f2682051572a08c1f5bc321a1af6" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-type.png" />
    </Frame>

    3\. Establece **Bind Mode** en **Direct binding** y **Search Mode** en **Direct querying**:

    <Frame caption="Authentik: modo de enlace y de búsqueda del proveedor LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-modes.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ea147f1605e76142021d07f775d5ef53" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-modes.png" />
    </Frame>

    4\. Más abajo, establece **Bind Flow** en `default-authentication-flow` y **Base DN** en tu Base DN, por ejemplo `dc=example,dc=com`:

    <Frame caption="Authentik: flujo de enlace y Base DN del proveedor LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-basedn.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=4ce418571d83294ee749d56b13c63d44" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-basedn.png" />
    </Frame>

    5\. Haz clic en **Next** hasta llegar a la última página y envía la aplicación.
  </Step>

  <Step title="Permitir que la cuenta de enlace busque en el directorio">
    Sin este permiso, la cuenta de enlace solo se ve a sí misma, la búsqueda no encuentra ningún usuario y todos los inicios de sesión LDAP fallan.

    Abre el proveedor, ve a **Permissions** y haz clic en **Assign Role Object Permission**. En **Role**, escribe el número del paso 1 y selecciona `ak-managed-role--user-<number>`; después activa **Search full LDAP directory**:

    <Frame caption="Authentik: conceder a la cuenta de enlace el permiso de búsqueda (instancia de prueba)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-assign.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=5af53c691ae845adcb4ede42c24fb600" alt="" width="1120" height="529" data-path="images/on-premises/ldap-authentik-assign.png" />
    </Frame>

    A continuación, el rol muestra una marca de verificación en **Search full LDAP directory**:

    <Frame caption="Authentik: permisos de un proveedor LDAP (instancia de prueba)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-permissions.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=24ae7f0dfb6d19e1b3d6584d6ccf0f0b" alt="" width="990" height="488" data-path="images/on-premises/ldap-authentik-permissions.png" />
    </Frame>
  </Step>

  <Step title="Ejecutar el outpost LDAP">
    Authentik responde a LDAP a través de un outpost, un contenedor independiente. Abre **Applications > Outposts**, crea un outpost de tipo **LDAP** con tu proveedor y despliégalo como indica Authentik. Escucha en el puerto 389 del host en el que se ejecuta. Cuando está conectado, muestra una marca verde:

    <Frame caption="Authentik: un outpost LDAP en ejecución (instancia de prueba)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-outposts.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=cd8af2f7df7b2df24d2369416509faef" alt="" width="990" height="468" data-path="images/on-premises/ldap-authentik-outposts.png" />
    </Frame>

    ```dotenv theme={null}
    OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
    ```
  </Step>

  <Step title="Rellenar los DN">
    La página del proveedor muestra el Base DN y un ejemplo en **How to connect**:

    <Frame caption="Authentik: vista general de un proveedor LDAP (instancia de prueba)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-provider.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=9aa4b747f4c0f51533454a97d835c18c" alt="" width="990" height="773" data-path="images/on-premises/ldap-authentik-provider.png" />
    </Frame>

    No copies los valores de ejemplo tal cual:

    * **Bind DN** muestra la cuenta con la que has iniciado sesión. Usa en su lugar la cuenta de enlace del paso 1: `cn=ldapservice,ou=users,<Base DN>`.
    * **Search base** muestra el Base DN. Usa `ou=users,<Base DN>`.

    ```dotenv theme={null}
    OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
    OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
    OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
    OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
    ```

    <Warning>
      Authentik mantiene un grupo con el nombre de cada usuario en `ou=virtual-groups`. Al buscar `(cn=alice)` en todo el Base DN se encuentran tanto `cn=alice,ou=users,…` como `cn=alice,ou=virtual-groups,…`, y Overleaf rechaza un inicio de sesión que coincida con más de una entrada. Mantén la base de búsqueda en `ou=users,<Base DN>`.
    </Warning>
  </Step>

  <Step title="Comprobar la búsqueda">
    Antes de iniciar Overleaf, ejecuta la misma búsqueda que hará. Debe mostrar exactamente un `dn:`:

    ```shell theme={null}
    ldapsearch -x -H ldap://ldap.example.com:389 \
      -D cn=ldapservice,ou=users,dc=example,dc=com -w '<password of ldapservice>' \
      -b ou=users,dc=example,dc=com '(cn=alice)' dn
    ```

    Si no aparece ningún `dn:`, normalmente falta el permiso del paso 3.
  </Step>

  <Step title="Asignar los administradores (opcional)">
    Los grupos de un usuario están en `memberOf`, como DN bajo `ou=groups`. Para que los miembros del grupo `Admins` de Authentik sean administradores de Overleaf:

    ```dotenv theme={null}
    OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
    OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
    ```

    <Warning>
      El indicador de administrador se actualiza en cada inicio de sesión LDAP. Con un atributo o un valor incorrecto, todos los administradores que inicien sesión mediante LDAP pierden los derechos de administrador. Prueba primero la asignación con una segunda cuenta de administrador.
    </Warning>
  </Step>
</Steps>

<Accordion title="Archivo variables.env probado para goauthentik">
  ```dotenv title="variables.env" wrap theme={null}
  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_IDENTITY_SERVICE_NAME=Log in with Authentik
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
  OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_NAME_ATT=name
  OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
  ```
</Accordion>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.