> 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/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 la [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 pour configurer SAML, il vaut la peine de lire le README de `passport-saml` pour 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, l'utilisateur est redirigé vers le site d'authentification du fournisseur d'identité (IdP). Si l'IdP authentifie correctement l'utilisateur, la base de données des utilisateurs d'Overleaf est vérifiée à la recherche d'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 recherchée pour un utilisateur dont l’adresse e-mail principale correspond à l’e-mail dans le profil utilisateur de l’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 Email 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 le `first_name` et `last_name` champ à la connexion, et désactiver le formulaire des détails utilisateur à `/user/settings` .
* `OVERLEAF_SAML_ENTRYPOINT` **(requis)**
  * URL 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é dispose de plusieurs certificats de signature valides, il peut s'agir d'un tableau JSON de chemins vers les certificats.
    * Exemple (un certificat) : `/var/lib/overleaf/certs/idp_cert.pem`
    * Exemple (certificats multiples) : `["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 être intégré dans les requêtes d'authentification afin que l'IdP puisse valider les signatures de la requête SAML entrante. Il est requis lors de la configuration du [point de terminaison des 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 certificat public actuel `OVERLEAF_SAML_PRIVATE_KEY`. Des entrées supplémentaires dans le tableau peuvent être utilisées pour publier les futurs certificats auprès des IdP avant de modifier 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 des 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 toute assertion chiffrée reçue.
* `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 si 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`
  * Décalage acceptable, en millisecondes, entre le client et le serveur lors de la vérification des horodatages de validité des conditions d'assertion OnBefore et NotOnOrAfter. La valeur -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 pour demander 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 spécifie que l'IdP doit forcer la ré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 ceci sur `true` pour autoriser des contextes supplémentaires tels que les 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 auprès de l'IdP via la liaison HTTP POST, sinon la valeur par défaut est HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * Si `always`, alors InResponseTo sera validé à partir des réponses SAML entrantes.
  * Si `jamais`, alors InResponseTo ne sera pas validé (par défaut).
  * Si `ifPresent`, 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’il est défini sur `true` (par défaut), Overleaf s'attend à ce que les assertions SAML, respectivement l'ensemble de la réponse d'authentification SAML, 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 délai d'expiration au-delà duquel un ID de requête généré pour une requête SAML ne sera pas valide s'il apparaît dans une réponse SAML dans le `InResponseTo` champ InResponseTo. 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 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éfinie sur `false`. Si l'une de ces variables n'est pas définie, alors le statut administrateur n'est défini que `true` lors de la création de l'utilisateur administrateur dans Launchpad.

**Métadonnées du 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 « Service Provider ». Consultez la documentation de votre serveur SAML pour savoir comment procéder.

Voici un exemple de métadonnées appropriées du fournisseur de services :

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

Remarquez les certificats, `AssertionConsumerService.Location`, `SingleLogoutService.Location` et `EntityDescriptor.entityID` et configurez-les de manière appropriée dans votre configuration 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 à l'aide d'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 de support", "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 service 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=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/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.
