> 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/saml-authentication.md).

# Authentification SAML

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.

### Configuration

En interne, le module SAML d’Overleaf utilise le [passport-saml](https://github.com/node-saml/passport-saml) bibliothèque, la plupart des options de configuration suivantes sont transmises à `passport-saml`. Si vous rencontrez des problèmes lors de la configuration de SAML, il vaut la peine de lire le README de `passport-saml` afin de vous faire une idée de la configuration attendue.

La variable d'environnement `EXTERNAL_AUTH` est requis pour activer le module d’authentification SAML. Cette variable d’environnement précise quelles méthodes d’authentification externes sont activées. La valeur de cette variable est une liste. Si la liste inclut `saml` alors l’authentification SAML sera activée.

Par exemple : `EXTERNAL_AUTH=ldap saml`

Lors de l’utilisation de la méthode d’authentification SAML, un utilisateur est redirigé vers le site d’authentification du fournisseur d’identité (IdP). Si l’IdP authentifie l’utilisateur avec succès, la base de données des utilisateurs d’Overleaf est vérifiée pour un enregistrement contenant un `samlIdentifiers` champ structuré comme suit :

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

Le `externalUserId` doit correspondre à la valeur de la propriété spécifiée par `userIdAttribute` dans le profil utilisateur renvoyé par le serveur IdP.

Si aucun enregistrement correspondant n’est trouvé, la base de données est consultée pour rechercher un utilisateur dont l’adresse e-mail principale correspond à l’e-mail du profil utilisateur IdP :

* Si un tel utilisateur est trouvé, le `hashedPassword` le champ est supprimé pour désactiver l’authentification locale, et le `samlIdentifiers` champ est ajouté.
* Si aucun utilisateur correspondant n’est trouvé, un nouvel utilisateur est créé avec l’adresse e-mail et `samlIdentifiers` du profil IdP.

**Remarque :** Actuellement, un seul IdP SAML est pris en charge. Le `providerId` champ dans `samlIdentifiers` est fixé à `'1'`.

#### Variables d'environnement

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * Nom d’affichage du service d’identité, utilisé sur la page de connexion (par défaut : `Se connecter avec l’IdP SAML`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * La valeur de cet attribut sera utilisée par Overleaf comme ID utilisateur externe, par défaut `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * Nom du champ E-mail dans le profil utilisateur, par défaut `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * Nom du champ firstName dans le profil utilisateur, par défaut `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * Nom du champ lastName dans le profil utilisateur, par défaut `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * Si défini sur `true`, met à jour l’utilisateur `first_name` et `last_name` mettre à jour les détails utilisateur à la connexion, et désactiver le formulaire des détails utilisateur sur `/user/settings` page.
* `OVERLEAF_SAML_ENTRYPOINT` **(requis)**
  * URL du point d’entrée pour le service d’identité SAML.
    * Exemple : `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * Exemple Azure : `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(requis)**
  * Le nom de l’émetteur.
* `OVERLEAF_SAML_AUDIENCE`
  * Audience attendue de la réponse SAML, par défaut la valeur de `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(requis)**
  * Chemin vers un fichier contenant le certificat public du fournisseur d’identité, utilisé pour valider les signatures des réponses SAML entrantes. Si le fournisseur d’identité possède plusieurs certificats de signature valides, alors il peut s’agir d’un tableau JSON de chemins vers les certificats.
    * Exemple (un certificat) : `/var/lib/overleaf/certs/idp_cert.pem`
    * Exemple (plusieurs certificats) : `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * Chemin vers un fichier contenant le certificat public de signature utilisé pour l’intégrer dans les requêtes d’authentification afin que l’IdP valide les signatures de la requête SAML entrante. C’est requis lors de la configuration de la [point de terminaison de métadonnées](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) lorsque la stratégie est configurée avec un `OVERLEAF_SAML_PRIVATE_KEY`. Un tableau JSON de chemins vers les certificats peut être fourni pour prendre en charge la rotation des certificats. Lors de la fourniture d’un tableau de certificats, la première entrée du tableau doit correspondre au `OVERLEAF_SAML_PRIVATE_KEY`. Des entrées supplémentaires du tableau peuvent être utilisées pour publier les certificats à venir auprès des IdP avant de changer le `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * Chemin vers un fichier contenant une clé privée au format PEM correspondant au `OVERLEAF_SAML_PUBLIC_CERT` utilisée pour signer les requêtes d’authentification envoyées par passport-saml.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * Chemin vers un fichier contenant le certificat public, utilisé pour le [point de terminaison de métadonnées](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * Chemin vers un fichier contenant la clé privée correspondant au `OVERLEAF_SAML_DECRYPTION_CERT` qui sera utilisée pour tenter de déchiffrer toutes les assertions chiffrées reçues.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * Définissez éventuellement l’algorithme de signature pour signer les requêtes, les valeurs valides sont 'sha1' (par défaut), 'sha256' (préféré), 'sha512' (le plus sûr, vérifiez que votre IdP le prend en charge).
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * Dictionnaire JSON de paramètres de requête supplémentaires à ajouter à toutes les requêtes.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * Dictionnaire JSON de paramètres de requête supplémentaires à ajouter aux requêtes 'authorize'.
    * Exemple : `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * Format de l’identifiant de nom à demander au fournisseur d’identité (par défaut : `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). Si vous utilisez `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, assurez-vous que la `OVERLEAF_SAML_EMAIL_FIELD` variable d’environnement est définie. Si `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` est requis, vous devez également définir la `OVERLEAF_SAML_ID_FIELD` variable d’environnement, qui peut, par exemple, être définie sur l’adresse e-mail de l’utilisateur.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * Temps, en millisecondes, du décalage acceptable entre le client et le serveur lors de la vérification des horodatages de validité des conditions d’assertion OnBefore et NotOnOrAfter. Le réglage sur -1 désactivera complètement la vérification de ces conditions. La valeur par défaut est 0.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` attribut à ajouter à AuthnRequest pour indiquer à l’IdP quel ensemble d’attributs joindre à la réponse ([lien](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * Tableau JSON de valeurs de format d’identifiant de nom à demander pour le contexte d’authentification. Par défaut : `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * Si `true`, la requête SAML initiale du fournisseur de services précise que l’IdP doit forcer une nouvelle authentification de l’utilisateur, même s’il dispose d’une session valide.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * Si `true`, ne demandez pas de contexte d’authentification spécifique. Par exemple, vous pouvez définir cela sur `true` pour autoriser des contextes supplémentaires tels que des connexions sans mot de passe (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). La prise en charge de contextes supplémentaires dépend de votre IdP.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * Si défini sur `HTTP-POST`, demandera l’authentification à l’IdP via la liaison HTTP POST, sinon utilisera par défaut HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * Si `toujours`, alors InResponseTo sera validé à partir des réponses SAML entrantes.
  * Si `ne jamais`, alors InResponseTo ne sera pas validé (par défaut).
  * Si `si présent`, alors InResponseTo ne sera validé que s’il est présent dans la réponse SAML entrante.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` et `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * Lorsqu'elle est définie sur `true` (par défaut), Overleaf s’attend à ce que les assertions SAML, respectivement la réponse d’authentification SAML entière, soient signées par l’IdP. Lorsque les deux options sont `false`, au moins l’une des assertions ou la réponse doit être signée.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * Définit le temps d’expiration pendant lequel un Request ID généré pour une requête SAML ne sera pas valide s’il est vu dans une réponse SAML dans le `InResponseTo` champ. Par défaut : 28800000 (8 heures).
* `OVERLEAF_SAML_LOGOUT_URL`
  * adresse de base à appeler avec les requêtes de déconnexion (par défaut : `entryPoint`).
    * Exemple : `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * Dictionnaire JSON de paramètres de requête supplémentaires à ajouter aux requêtes 'logout'.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` et `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * Lorsque les deux variables d'environnement sont définies, le processus de connexion met à jour `user.isAdmin = true` si le profil renvoyé par l’IdP SAML contient l’attribut spécifié par `OVERLEAF_SAML_IS_ADMIN_FIELD` et si sa valeur correspond soit à `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` ou est un tableau contenant `OVERLEAF_SAML_IS_ADMIN_FIELD_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.

**Métadonnées pour le fournisseur d’identité**

La version actuelle d’Overleaf CE inclut un point de terminaison pour récupérer les métadonnées du fournisseur de services : `http://my-overleaf-instance.com/saml/meta`

Le fournisseur d’identité devra être configuré pour reconnaître le serveur Overleaf comme un « fournisseur de services ». Consultez la documentation de votre serveur SAML pour savoir comment faire.

Voici ci-dessous un exemple de métadonnées de fournisseur de services appropriées :

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

Notez les certificats, `AssertionConsumerService.Location`, `SingleLogoutService.Location` et `EntityDescriptor.entityID` et définissez-les de manière appropriée dans la configuration de votre IdP, ou envoyez le fichier de métadonnées à l’administrateur IdP.

<details>

<summary><strong>Exemple de fichier variables.env (minimum)</strong></summary>

<pre><code>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

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

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Se connecter avec le fournisseur SAML'
OVERLEAF_SAML_EMAIL_FIELD=E-mail
OVERLEAF_SAML_FIRST_NAME_FIELD=Nom affiché
OVERLEAF_SAML_LAST_NAME_FIELD=Nom affiché
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/fr/configuration/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.
