> 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/fr/configuration/overleaf-toolkit/authentication/ldap-authentication.md).

# Authentification LDAP

Cette fonctionnalité a été développée par [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Ici, nous proposons quelques documents pour votre configuration.

{% hint style="warning" %}
Overleaf utilise **passport-ldapauth** bibliothèque, qui est relativement obsolète, la compatibilité LDAP ne peut pas être entièrement garantie. Avec certains fournisseurs d'identité LDAP (par exemple, <https://goauthentik.io/>), des échecs de connexion peuvent se produire. Par conséquent, si possible, il est recommandé d'utiliser auparavant OAuth/SAML.
{% endhint %}

### Qu'est-ce que le LDAP

LDAP est un protocole d'authentification utilisé pour la vérification d'identité externe. Overleaf Server Pro fournit un formulaire de connexion LDAP dédié dans l'interface web, distinct de la méthode d'authentification standard. Lorsqu'un utilisateur saisit son nom d'utilisateur LDAP et son mot de passe, le backend d'Overleaf vérifie les identifiants auprès du serveur LDAP configuré, par exemple `ldap://ldap:10389`.

<figure><img src="/files/6785e52c05ce031b2af2b3b0fca8fe7479de3390" alt=""><figcaption><p>Un exemple Server Pro pour LDAP</p></figcaption></figure>

### Configuration

En interne, Overleaf LDAP utilise [passport-ldapauth](https://github.com/vesse/passport-ldapauth) bibliothèque. La plupart de ces options de configuration sont transmises au `serveur` objet de configuration utilisé pour configurer `passport-ldapauth`. Si vous rencontrez des difficultés pour configurer LDAP, il vaut la peine de lire le README de `passport-ldapauth` afin de vous faire une idée de la configuration attendue.

La variable d'environnement `EXTERNAL_AUTH` est requise pour activer le module d'authentification LDAP. Cette variable d'environnement spécifie quelles méthodes d'authentification externes sont activées. La valeur de cette variable est une liste. Si la liste inclut `ldap` alors l'authentification LDAP sera activée.

Par exemple : `EXTERNAL_AUTH=ldap saml`

Contrairement à Overleaf CEP, dans notre édition ayaka-notes, nous limitons l'authentification LDAP à une simple méthode d'authentification, disponible à `http://your-overleaf.com/ldap/login`.

Lors de l'utilisation des méthodes d'authentification LDAP, un utilisateur saisit un `nom d'utilisateur` et `mot de passe` dans le formulaire de connexion, les opérations suivantes sont tentées :

1. Un utilisateur LDAP est recherché dans l'annuaire LDAP à l'aide du filtre défini par `OVERLEAF_LDAP_SEARCH_FILTER` et authentifié.
2. Si l'authentification réussit, la base de données des utilisateurs d'Overleaf est consultée afin de trouver un utilisateur dont l'adresse e-mail principale correspond à l'adresse e-mail de l'utilisateur LDAP authentifié :
   * Si un utilisateur correspondant est trouvé, le `hashedPassword` champ de cet utilisateur est supprimé (s'il existe). Cela garantit que l'utilisateur ne pourra à l'avenir se connecter que via l'authentification LDAP.
   * Si aucun utilisateur correspondant n'est trouvé, un nouvel utilisateur Overleaf est créé à l'aide de l'e-mail, du prénom et du nom récupérés depuis le serveur LDAP.

{% hint style="danger" %}
Pour les utilisateurs qui se connectent via LDAP, nous ne stockons pas (ou supprimons les mots de passe hachés existants) dans la base de données Mongo d'Overleaf.
{% endhint %}

#### Variables d'environnement

* `OVERLEAF_LDAP_URL` **(requis)**
  * URL du serveur LDAP.
    * Exemple : `ldaps://ldap.example.com:636` (LDAP via SSL)
    * Exemple : `ldap://ldap.example.com:389` (non chiffré ou STARTTLS, si configuré).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Nom d'affichage du service d'identité LDAP, utilisé sur la page de connexion.
  * Par défaut : `Se connecter avec le fournisseur LDAP`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * L'attribut e-mail renvoyé par le serveur LDAP, par défaut `mail`. Chaque utilisateur LDAP doit avoir au moins une adresse e-mail. Si plusieurs adresses sont fournies, seule la première sera utilisée.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * Le nom de propriété contenant le prénom de l'utilisateur utilisé dans l'application, généralement `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * Le nom de propriété contenant le nom de famille de l'utilisateur utilisé dans l'application, généralement `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * Le nom de propriété contenant le nom complet de l'utilisateur, généralement `cn`. Si l'une des deux variables précédentes n'est pas définie, le prénom et/ou le nom de famille de l'utilisateur est extrait de cette variable. Sinon, elle n'est pas utilisée.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * L'espace réservé du formulaire de connexion, par défaut `Nom d'utilisateur`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Si défini sur `true`, met à jour l'utilisateur LDAP `first_name` et `last_name` champ à la connexion, et désactive le formulaire des détails utilisateur sur la `/user/settings` page pour les utilisateurs LDAP. Sinon, les détails ne seront récupérés qu'à la première connexion.
* `OVERLEAF_LDAP_BIND_DN`
  * Le nom distinctif de l'utilisateur LDAP qui doit être utilisé pour la connexion LDAP (cet utilisateur doit pouvoir rechercher/lister les comptes sur le serveur LDAP), par exemple : `cn=ldap_reader,dc=example,dc=com`. Si non défini, une liaison anonyme est utilisée.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Mot de passe de `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Propriété de l'utilisateur à lier côté client, par défaut `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` **(requis)**
  * Le DN de base à partir duquel rechercher les utilisateurs. Par exemple : `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * Filtre de recherche LDAP permettant de trouver un utilisateur. Utilisez la chaîne littérale '{{username}}' pour interpoler le nom d'utilisateur fourni dans la recherche LDAP.
    * Exemple : `(|(uid={{username}})(mail={{username}}))` (l'utilisateur peut se connecter avec son e-mail ou son nom de connexion).
    * Exemple : `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * La portée de la recherche peut être `base`, `one`, ou `sub` (par défaut).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * Tableau JSON des attributs à récupérer depuis le serveur LDAP, par exemple : `["uid", "mail", "givenName", "sn"]`. Par défaut, tous les attributs sont récupérés.
* `OVERLEAF_LDAP_STARTTLS`
  * Si `true`, LDAP via TLS est utilisé.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * Chemin vers le fichier contenant le certificat de l'AC utilisé pour vérifier le certificat SSL/TLS du serveur LDAP. S'il existe plusieurs certificats, il peut s'agir d'un tableau JSON de chemins vers les certificats. Les fichiers doivent être accessibles au conteneur Docker.
    * Exemple (un certificat) : `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * Exemple (plusieurs certificats) : `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * Si `true`, le certificat du serveur est vérifié par rapport à la liste des AC fournies.
* `OVERLEAF_LDAP_CACHE`
  * Si `true`, alors jusqu'à 100 identifiants à la fois seront mis en cache pendant 5 minutes.
* `OVERLEAF_LDAP_TIMEOUT`
  * Durée pendant laquelle le client doit laisser les opérations s'exécuter avant un délai d'attente, en ms (par défaut : infini).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * Durée pendant laquelle le client doit attendre avant un délai d'attente sur les connexions TCP, en ms (par défaut : valeur par défaut du système d'exploitation).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` et `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * Lorsque les deux variables d'environnement sont définies, le processus de connexion met à jour `user.isAdmin = true` si le profil LDAP contient l'attribut spécifié par `OVERLEAF_LDAP_IS_ADMIN_ATT` et si sa valeur correspond soit à `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` ou est un tableau contenant `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`, sinon `user.isAdmin` est défini à `false`. Si l'une de ces variables n'est pas définie, alors le statut d'administrateur est uniquement défini à `true` lors de la création de l'utilisateur administrateur dans Launchpad.

Les cinq variables suivantes servent à configurer la manière dont les contacts des utilisateurs sont récupérés depuis le serveur LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * Le filtre utilisé pour rechercher des utilisateurs sur le serveur LDAP à charger dans les contacts. L'espace réservé '{{userProperty}}' dans le filtre est remplacé par la valeur de la propriété spécifiée par `OVERLEAF_LDAP_CONTACTS_PROPERTY` de l'utilisateur LDAP à l'origine de la recherche. Si non définie, aucun utilisateur n'est récupéré du serveur LDAP dans les contacts.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * Spécifie le DN de base à partir duquel commencer la recherche des contacts. Par défaut `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * La portée de la recherche peut être `base`, `one`, ou `sub` (par défaut).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * Spécifie la propriété de l'objet utilisateur qui remplacera l'espace réservé '{{userProperty}}' dans le `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * Spécifie la valeur de `OVERLEAF_LDAP_CONTACTS_PROPERTY` si la recherche est initiée par un utilisateur non LDAP. Si cette variable n'est pas définie, le filtre résultant ne correspondra à rien. La valeur `*` peut être utilisée comme caractère générique.

<details>

<summary><strong>Exemple</strong></summary>

```
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
```

L'exemple ci-dessus charge dans les contacts de l'utilisateur LDAP actuel tous les utilisateurs LDAP qui ont le même UNIX `gid`. Les utilisateurs non LDAP auront tous les utilisateurs LDAP avec UNIX `gid=1000` dans leurs contacts.

</details>

<details>

<summary><strong>Exemple de fichier variables.env</strong></summary>

```
OVERLEAF_APP_NAME="Notre instance Overleaf"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Active la génération de miniatures avec ImageMagick
ENABLE_CONVERSIONS=true

# Désactive l'exigence de confirmation par e-mail
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Définir pour 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": "Contactez votre équipe d'assistance", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Bonjour, je suis à droite", "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=Ce système est géré par le département x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
## LDAP pour 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='Nom d'utilisateur ou adresse e-mail'

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='*'
```

</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/fr/configuration/overleaf-toolkit/authentication/ldap-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.
