Files
mintlify__docs/fr/deploy/authentication-setup.mdx
Ethan Palm 9a4ec7b557 Editor docs overhaul (#7112)
* Fix editor docs accuracy, split media page, clear translation orphans

Accuracy fixes, each verified against mintlify/mint or mintlify/server:

- pages.mdx: "Editors and managers can restore them" -> "admins".
  "Manager" is not a Mintlify role.
- index.mdx: publishing on a feature branch does not automatically open a
  pull request; you choose commit-to-branch or PR. Contradicted the
  branching page's own table.
- branching-and-publishing.mdx: preview deployments build when you open a
  pull request, not on every branch save. Confirmed in gitlabWebhooks
  (handleMergeRequestOpenEvent) and cruxWebhooks (keyed on reviewId).
  tutorial.mdx was already correct.
- settings.mdx: rewritten against editor-settings-form.tsx. The panel has
  four sections, not "two layers", and the entire Appearance section was
  undocumented - including "Open live preview in new tab", which
  live-preview.mdx already linked readers to. Corrected three setting
  labels, noted that draft PRs default to on, added the 20,000-character
  instruction limit.
- live-preview.mdx: link now resolves to /editor/settings#appearance.

De-bloat:

- Split the media section out of pages.mdx (172 lines, 15 subtopics) into
  editor/media.mdx and added it to the nav.
- Trimmed index.mdx from 11 sidebar-duplicating cards to 4.

Translation orphans and redirects:

- Deleted 7 translated files whose English source was removed in April and
  June. The translate automation never cleaned them up, and in PR #6062 it
  wrote into es|fr|zh/editor/media.mdx 34 days after the English source was
  deleted.
- Dropped /editor/media -> /editor/pages so it stops shadowing the
  recreated page.
- Added /{es,fr,zh}/editor/publish, completing an English-only redirect.
- Added /editor/collaborate and its language variants. That page was
  deleted in June with no redirect and has been a live 404 since.

mint broken-links clean, mint a11y clean, vale 0/0/0 on changed files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restructure editor docs: 14 pages to 9, cut UI description

The editor section had grown to 14 pages, about 40% of which described
things a user can see on screen. The ratio was 105 field-enumeration
bullets to 42 procedural steps.

New structure, organized around what is invisible rather than what is
on screen:

  Overview      absorbs git-essentials (concepts + the Git mapping table)
  Tutorial      unchanged
  Edit content  absorbs media and navigation
  Publish       branch mechanics, conflicts, git sync, commit signing
  Review        previews, pull requests, approve and merge
  Collaborate   comments + suggestions + real-time editing
  Editor agent  trimmed
  Settings      absorbs configurations as a pointer
  Keyboard shortcuts  unchanged

Removed: git-essentials, media, navigation, live-preview, comments,
suggestions, configurations, branching-and-publishing. Added: publish,
review, collaborate.

configurations.mdx was the clearest cut. It was a 193-line field-by-field
mirror of the Site configurations panel, which is a third rendering of
information already in the docs.json schema and in organize/settings-*
(2,694 lines). It is now a short section in settings.mdx covering only
what is specific to editing configuration from the editor: real-time
sync, the SVG logo constraint, and the redirects interface.

Also cut: block actions, the minimap, code block options, right-click
menu enumerations, page settings field lists (already delegated to
/organize/pages), and most screenshots of self-evident controls.

1,320 to 848 body lines. Field-enumeration bullets 105 to 29.

English redirects added for all eight removed pages. Language variants
deliberately omitted: es/fr/zh still carry the old structure, so
redirecting those paths now would shadow pages that still exist there.
The translation automation should mirror this restructure; verify
afterward that no orphans remain.

Vale vocabulary widened rather than reworded around: autocommit(s|ed|ing)?,
autosav(e|es|ed|ing), dotfile(s)?.

mint broken-links clean, mint a11y clean, vale 0 errors on editor/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Correct keyboard shortcuts against the editor keymap

Verified every documented shortcut against the bindings in mintlify/mint
rather than inferring them. The app-level set is exhaustive:
mod+backslash, mod+i, mod+k, mod+s, mod+shift+period, mod+z, shift+mod+d,
shift+mod+s. Visual-mode bindings come from the Tiptap extensions.

- Cmd/Ctrl+Shift+F ("Switch between Navigation and Files tree") does not
  exist. No such binding is registered anywhere in the dashboard. Replaced
  with the real binding at that spot in the UI: Cmd/Ctrl+Shift+. toggles
  "Show all files".
- Added Heading 5 and Heading 6. Heading.configure sets levels 1-6 and
  preserves the parent Mod-Alt-N shortcuts; the table stopped at 4.
- Added Cmd/Ctrl+G for accordion group, bound in Accordions.tsx.

Confirmed correct and unchanged: Cmd+K search, Cmd+I agent, Cmd+Shift+S
mode toggle, Cmd+Shift+D diff, Cmd+\ sidebar, Cmd+Shift+M comment,
Cmd+Shift+E suggesting mode, Cmd+Shift+X strikethrough, Cmd+K link,
Cmd+Enter line break, Cmd+Shift+8 unordered list, and that source mode
runs Monaco.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Document auto publish, drop the deprecated deploy branch lock

Auto publish is available to all deployments, so the settings panel shows
"Auto publish" rather than "Main branch autocommits". It is not just a
rename: when it is on, the editor hides the branch selector and the
Publish button entirely (TopBar returns null for both), so there is no
pending state and no review step. Documented that behavior in
settings.mdx and added a note at the top of publish.mdx, since that page
otherwise assumes a publish step exists.

The deployment branch lock was deprecated and removed, so it stays out of
the docs. It was already dropped from settings.mdx in the restructure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* 💅

* copy edit index

* Fix editor docs I verified against dead code

Three claims traced to code that never mounts. Ethan confirmed the diff
shortcut does not work, which exposed the pattern.

- Removed Cmd/Ctrl+Shift+D for diff view. It is registered only at
  SubBar/index.tsx:488, inside EditorSubBar, which is exported and
  imported by nothing. There is no live diff shortcut; exitDiff exists
  only as an onClick in EditorModeContextMenu.
- Source mode runs CodeMirror, not Monaco. SourceEditor resolves through
  source-editor/index.tsx to editor-view.tsx, which imports
  @codemirror/state and @codemirror/view. Monaco is used only by
  EmbedModal. The shortcut rows themselves were correct: CodeMirror's
  defaultKeymap and searchKeymap match VS Code for toggle comment, move
  line, duplicate line, find, and add cursor above/below, all confirmed
  against @codemirror/commands.
- Rewrote the left panel section of pages.mdx. The tabs are Home and
  Publishing (EditorNavigationSidebarContents.tsx:62), not Navigation and
  Files. The Navigation/Files switcher lives in the same dead SubBar
  component. Home renders the workspace file tree including private
  pages; Publishing renders the site navigation and site settings.
  Confirmed by the e2e helper openPublishingNavigation, which queries the
  Publishing tab by role against the running app.

Also corrected in that section: the tree hides docs.json, dotfiles,
extensionless files, all-caps Markdown, and css/js/jsx/mjs/cjs/pdf unless
Show all files is on; "unlisted" was an invented term, replaced with a
link to /organize/hidden-pages; and the folder menu item is "New page",
confirmed by e2e, not "New file".

Added four source-mode bindings that are real and undocumented: Cmd+B and
Cmd+I insert Markdown markers, Cmd+Option+Shift+[ and ] fold and unfold
all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* copy edit pages

* copy edit publish

* copy edit review

* copy edit settings

* copy edit collaborate

* Updated mintlify pages

- Updated quickstart.mdx

Mintlify-Source: dashboard-editor

* copy edit keyboard shortcuts

* Updated mintlify pages

- Updated quickstart.mdx

Mintlify-Source: dashboard-editor

* Revert "Updated mintlify pages"

This reverts commit 8d1b50cbfc.

* Updated mintlify pages

- Updated quickstart.mdx

Mintlify-Source: dashboard-editor

* fix editor edits

* Mirror the editor restructure into es, fr, and zh

Brings all three translated sites onto the same nine-page structure as
English instead of waiting for the translate automation, which has a
documented history of leaving orphans behind.

Content:
- Deleted 21 orphans: branching-and-publishing, comments, configurations,
  git-essentials, live-preview, navigation, and suggestions in each
  language. None had an English source after the restructure.
- Added publish, review, and collaborate in each language.
- Rewrote index, pages, settings, agent, and keyboard-shortcuts to match
  the current English content, including Home/Publishing tabs, CodeMirror
  source mode, Show all files, and the restored Appearance section.
- Kept the existing conventions: es uses usted, fr uses vous, keywords and
  product UI labels stay in English, and every heading is wrapped in a
  <div id="english-slug"> so cross-language anchors resolve. Verified that
  every English anchor exists in all three languages.

Navigation and redirects:
- es.json, fr.json, and zh.json now list the same nine pages as docs.json.
- Removed six locale redirects that would have shadowed the new publish
  and collaborate pages once they existed.
- Added 21 locale redirects for the removed pages and retargeted the
  destinations that pointed at them.
- Retargeted four /editor/configurations redirects that pointed at
  #site-configurations, an anchor dropped in the settings rewrite.
- Rewrote stale links in changelog, authentication-setup, concepts, and
  glossary across all three languages, since broken-links does not follow
  redirects.

English fixes needed first, all caused by the settings restructure:
- Restored ## Appearance. Two pages link to #appearance, and its four
  preferences were otherwise undocumented.
- Restored ## Create draft pull requests by default, which changelog
  links to and which defaults to on.
- Promoted Main branch autocommits from ### to ##; it was nested under PR
  instructions, and its warning named a setting no longer on the page.
- Retargeted publish.mdx from the removed #auto-publish anchor.
- Fixed a missing space in the settings page intro.

mint broken-links clean, mint a11y clean (1042 files), vale 0 errors,
all five JSON files valid.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
2026-08-25 19:40:14 -07:00

585 lines
32 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Configuration de l'authentification"
description: "Configurez l'authentification pour contrôler l'accès aux pages et références d'API avec mot de passe, OAuth, JWT ou accès privé géré par Mintlify."
keywords: ['authentication', 'auth', 'OAuth', 'JWT', 'password', 'private']
---
<Info>
L'authentification privée pour votre organisation Mintlify est disponible sur toutes les offres.
L'authentification par mot de passe nécessite une [offre Pro ou Enterprise](https://mintlify.com/pricing?ref=authentication).
L'authentification OAuth et JWT nécessite une [offre Enterprise](https://mintlify.com/pricing?ref=authentication).
</Info>
Lauthentification exige que les utilisateurs se connectent avant daccéder à votre contenu.
Vous pouvez configurer une authentification complète pour toutes les pages ou une authentification partielle où certaines pages sont publiques et d'autres nécessitent une authentification.
L'authentification n'est disponible que pour les sites hébergés sur un domaine personnalisé ou un sous-domaine Mintlify. Par exemple, `docs.exemple.com` ou `exemple.mintlify.site`. L'authentification **n'est pas prise en charge** pour les sites avec un [sous-chemin personnalisé](/fr/deploy/docs-subpath). Par exemple, `exemple.com/docs`.
Pour identifier les visiteurs tout en gardant les pages publiques, utilisez la [personnalisation](/fr/create/personalization). La personnalisation prend en charge les sous-chemins personnalisés et peut préremplir les entrées du bac à sable d'API sans obliger les visiteurs à s'authentifier avant de consulter une page.
<div id="choose-an-authentication-method">
## Choisir une méthode d'authentification
</div>
Utilisez ce comparatif pour choisir la méthode adaptée à votre cas d'usage. Consultez [Disponibilité des fonctionnalités](#feature-availability) pour savoir comment chaque méthode interagit avec les autres fonctionnalités de Mintlify.
| Méthode | Idéal pour | Offre | Accès basé sur les groupes | Pré-remplissage du bac à sable d'API | Personnalisation |
| :--- | :--- | :--- | :---: | :---: | :---: |
| Password | Accès partagé simple sans suivi par utilisateur | Pro ou Enterprise | — | — | — |
| Private authentication | Documentation interne pour les membres de votre organisation Mintlify | Toutes les offres | — | — | — |
| OAuth 2.0 | Fournisseur d'identité existant ou SSO avec sessions par utilisateur | Enterprise | ✓ | ✓ | ✓ |
| JWT | Backend d'authentification personnalisé ou documentation intégrée derrière votre propre connexion | Enterprise | ✓ | ✓ | ✓ |
<div id="configure-authentication">
## Configurer lauthentification
</div>
<Tabs>
<Tab title="Mot de passe">
<Info>
L'authentification par mot de passe fournit uniquement un contrôle d'accès et ne prend **pas** en charge les fonctionnalités spécifiques aux utilisateurs comme le contrôle d'accès basé sur les groupes ou le pré-remplissage du bac à sable dAPI.
</Info>
<div id="password-prerequisites">
### Prérequis du mot de passe
</div>
* Vos exigences de sécurité autorisent le partage de mots de passe entre les utilisateurs.
<div id="password-setup">
### Configuration du mot de passe
</div>
<Steps>
<Step title="Créer un mot de passe.">
1. Dans votre Dashboard, accédez à [Authentication](https://dashboard.mintlify.com/products/authentication).
2. Dans la section **Authentication method**, définissez la visibilité du site sur **Private**.
3. Cliquez sur **Password**.
4. Saisissez un mot de passe sécurisé.
5. Cliquez sur **Save changes**.
Après avoir enregistré, votre site est redéployé. Une fois le déploiement terminé, toute personne visitant votre site doit entrer le mot de passe pour accéder à votre contenu.
</Step>
<Step title="Distribuer l'accès.">
Partagez de manière sécurisée le mot de passe et l'URL de la documentation avec les utilisateurs autorisés.
</Step>
</Steps>
<div id="password-example">
### Exemple de mot de passe
</div>
Vous hébergez votre documentation sur `docs.foo.com` et vous avez besoin d'un contrôle d'accès de base sans suivi des utilisateurs individuels. Vous voulez empêcher l'accès public tout en gardant la configuration simple.
**Créez un mot de passe robuste** dans votre Dashboard. **Partagez les identifiants de connexion** avec les utilisateurs autorisés.
</Tab>
<Tab title="Authentification privée">
<div id="private-authentication-prerequisites">
### Prérequis de lauthentification privée
</div>
* Toutes les personnes qui doivent accéder à votre site doivent être membres de votre organisation Mintlify.
<div id="private-authentication-setup">
### Configuration de lauthentification privée
</div>
<Steps>
<Step title="Activer lauthentification privée.">
1. Dans votre Dashboard, accédez à [Authentication](https://dashboard.mintlify.com/products/authentication).
2. Dans la section **Authentication method**, définissez la visibilité du site sur **Private**.
3. Cliquez sur **Authenticated**.
4. Cliquez sur **Save changes**.
Après avoir enregistré, votre site est redéployé. Lorsque le déploiement est terminé, toute personne qui visite votre site doit se connecter à votre organisation Mintlify pour accéder à votre contenu.
</Step>
<Step title="Ajouter des utilisateurs autorisés.">
1. Dans votre Tableau de bord Mintlify, allez à [Members](https://dashboard.mintlify.com/settings/organization/members).
2. Ajoutez chaque personne qui doit avoir accès à votre documentation.
3. Attribuez des rôles appropriés en fonction de leurs droits de modification.
</Step>
</Steps>
<div id="private-example">
### Exemple dauthentification privée
</div>
Vous hébergez votre documentation sur `docs.foo.com` et toute votre équipe a accès à votre Tableau de bord Mintlify. Vous souhaitez restreindre laccès aux seuls membres de léquipe.
**Activez lauthentification privée** dans les paramètres de votre Tableau de bord Mintlify.
**Vérifiez laccès de léquipe** en vous assurant que tous les membres de léquipe sont actifs dans votre organisation.
</Tab>
<Tab title="OAuth 2.0">
<div id="oauth-20-prerequisites">
### Prérequis OAuth 2.0
</div>
* Un serveur OAuth ou OIDC qui prend en charge le flux Authorization Code (Authorization Code Flow).
* Capacité à créer un endpoint d'API accessible via des jetons d'accès OAuth (facultatif, pour activer le contrôle d'accès basé sur les groupes).
<div id="oauth-20-setup">
### Configuration OAuth 2.0
</div>
<Steps>
<Step title="Configurez vos paramètres OAuth.">
1. Dans votre Dashboard, allez dans [Authentication](https://dashboard.mintlify.com/products/authentication).
2. Dans la section **Authentication method**, définissez la visibilité du site sur **Private**.
3. Cliquez sur **Custom**.
4. Cliquez sur **OAuth**.
5. Configurez les champs suivants :
* **Authorization URL** : Votre endpoint OAuth.
* **Client ID** : Votre identifiant client OAuth 2.0.
* **Client Secret** : Votre secret client OAuth 2.0.
* **Scopes** (facultatif) : Autorisations à demander. Copiez la chaîne de scope **entière** (par exemple, pour un scope comme `provider.users.docs`, copiez lintégralité de `provider.users.docs`). Utilisez plusieurs scopes si vous avez besoin de niveaux daccès différents.
* **Additional authorization parameters** (facultatif) : Paramètres de requête supplémentaires à ajouter à la requête dautorisation initiale.
* **Token URL** : Votre endpoint déchange de jeton OAuth.
* **Info API URL** (facultatif) : Endpoint sur votre serveur que Mintlify appelle pour récupérer les informations utilisateur. Utilisez ce champ pour lapproche Info API du contrôle daccès basé sur les groupes. Vous pouvez également utiliser les claims des jetons OAuth. Si aucune de ces options nest configurée, le flux OAuth vérifie uniquement lidentité.
* **Logout URL** (facultatif) : LURL de déconnexion native de votre fournisseur OAuth. Lorsque les utilisateurs se déconnectent, Mintlify valide la redirection de déconnexion par rapport à lURL configurée, pour des raisons de sécurité. La redirection ne réussit que si elle correspond exactement à la valeur de `logoutUrl` configurée. Si vous ne configurez pas dURL de déconnexion, les utilisateurs sont redirigés vers `/login`. Mintlify redirige les utilisateurs avec une requête `GET` et najoute aucun paramètre de requête. Incluez donc directement tous les paramètres (par exemple, `returnTo`) dans lURL.
* **Redirect URL** (facultatif) : LURL vers laquelle rediriger les utilisateurs après lauthentification.
6. Cliquez sur **Enregistrer les modifications**.
Une fois vos paramètres OAuth configurés, votre site est redéployé. Quand le déploiement est terminé, toute personne qui visite votre site doit se connecter à votre fournisseur OAuth pour accéder à votre contenu.
</Step>
<Step title="Configurez votre serveur OAuth.">
1. Copiez la **Redirect URL** à partir de vos [paramètres dauthentification](https://dashboard.mintlify.com/products/authentication).
2. Ajoutez cette URL de redirection comme URL de redirection autorisée pour votre serveur OAuth.
</Step>
<Step title="Créez votre endpoint dinformations utilisateur pour laccès basé sur les groupes (facultatif).">
Pour utiliser lapproche Info API du contrôle daccès basé sur les groupes, créez un endpoint dAPI qui :
* Répond aux requêtes `GET`.
* Accepte un en-tête `Authorization: Bearer <access_token>` pour lauthentification.
* Renvoie les données utilisateur au format `User`. Voir [User data format](#user-data-format) pour plus dinformations.
Mintlify appelle cet endpoint avec le jeton daccès OAuth pour récupérer les informations utilisateur. Aucun paramètre de requête supplémentaire nest envoyé.
Ajoutez lURL de cet endpoint dans le champ **Info API URL** de vos [paramètres dauthentification](https://dashboard.mintlify.com/products/authentication).
</Step>
</Steps>
<div id="use-groups-from-oauth-token-claims">
### Utiliser les groupes issus des claims des jetons OAuth
</div>
Si votre fournisseur didentité inclut lappartenance aux groupes dans lID token ou laccess token, vous pouvez utiliser ces claims à la place dune URL Info API. Cette option est disponible pour les configurations OAuth qui utilisent un secret client.
Lors de la configuration des claims des jetons OAuth pour votre déploiement, utilisez des valeurs telles que :
```json
{
"source": "id_token",
"groupsClaim": "groups",
"groupsDelimiter": ","
}
```
* `source` : Sélectionne `id_token` ou `access_token`. Si vous sélectionnez `id_token`, incluez le scope `openid` dans vos scopes OAuth.
* `groupsClaim` : Identifie le claim du token qui contient les groupes. Sa valeur par défaut est `groups`.
* `groupsDelimiter` : Délimiteur facultatif de 1 à 4 caractères. Mintlify lutilise uniquement pour diviser les valeurs de claim qui sont des chaînes.
Par exemple, avec `"groups": "general,clienta_eur"` et `groupsDelimiter` défini sur `","`, Mintlify utilise `general` et `clienta_eur` comme groupes distincts.
Mintlify supprime les espaces autour de chaque groupe et ignore les segments vides. Sans `groupsDelimiter`, la chaîne complète est traitée comme un seul groupe. Chaque élément de type chaîne dun claim sous forme de tableau est traité comme un groupe distinct et nest pas divisé.
Omettez `groupsDelimiter` lorsque le délimiteur peut faire partie du nom dun groupe.
<div id="oauth-20-example">
### Exemple OAuth 2.0
</div>
Vous hébergez votre documentation sur `docs.foo.com` et vous disposez dun serveur OAuth existant sur `auth.foo.com` qui prend en charge le flux « Authorization Code ».
**Configurez les détails de votre serveur OAuth** dans votre Dashboard :
* **Authorization URL** : `https://auth.foo.com/authorization`
* **Client ID** : `ydybo4SD8PR73vzWWd6S0ObH`
* **Scopes** : `['provider.users.docs']`
* **Token URL** : `https://auth.foo.com/exchange`
* **Info API URL** : `https://api.foo.com/docs/user-info`
* **Logout URL** : `https://auth.foo.com/logout?returnTo=https%3A%2F%2Fdocs.foo.com`
**Créez un endpoint dinformations utilisateur** à `api.foo.com/docs/user-info`, qui requiert un jeton daccès OAuth avec le scope `provider.users.docs`, et renvoie :
```json
{
"groups": ["engineering", "admin"],
"expiresAt": 1893456000,
"apiPlaygroundInputs": {
"header": {
"Authorization": "Bearer user_abc123"
}
}
}
```
<Note>
Contrôlez la durée de la session avec le champ `expiresAt` dans votre réponse d'informations utilisateur. Il s'agit d'un horodatage Unix (en secondes depuis l'époque Unix) indiquant quand la session doit expirer. Consultez le [format des données utilisateur](#user-data-format) pour plus de détails.
</Note>
**Configurez votre serveur OAuth pour autoriser les redirections** vers votre URL de rappel.
</Tab>
<Tab title="JWT">
<div id="jwt-prerequisites">
### Prérequis JWT
</div>
* Un système d'authentification capable de générer et de signer des JWT.
* Un service backend capable de créer des URL de redirection.
<div id="jwt-setup">
### Configuration JWT
</div>
<Steps>
<Step title="Générez une clé privée.">
1. Dans votre Dashboard, accédez à [Authentication](https://dashboard.mintlify.com/products/authentication).
2. Dans la section **Authentication method**, définissez la visibilité du site sur **Private**.
3. Cliquez sur **Custom**.
4. Cliquez sur **JWT**.
5. Saisissez lURL de votre flux de connexion existant.
6. Pour proposer plusieurs flux de connexion, cliquez sur **Add login URL** et saisissez un nom daffichage et une URL pour chaque option. Vous pouvez configurer jusquà 10 URL de connexion.
7. Cliquez sur **Enregistrer les modifications**.
8. Cliquez sur **Générer une nouvelle clé**.
9. Stockez votre clé en toute sécurité, là où votre backend peut y accéder.
Après avoir généré une clé privée, votre site est redéployé. Une fois le déploiement terminé, toute personne qui visite votre site doit se connecter à votre système dauthentification JWT pour accéder à votre contenu.
</Step>
<Step title="Intégrez lauthentification Mintlify dans votre flux de connexion.">
Modifiez votre flux de connexion existant pour inclure ces étapes après lauthentification de lutilisateur :
* Créez un JWT contenant les informations de lutilisateur authentifié au format `User`. Voir [Format des données utilisateur](#user-data-format) pour plus dinformations.
* Signez le JWT avec votre clé secrète, en utilisant lalgorithme EdDSA.
* Créez une URL de redirection vers le chemin `/login/jwt-callback` de votre documentation, en incluant le JWT comme hash.
</Step>
</Steps>
Lorsque l'authentification JWT n'a qu'une seule URL de connexion, les visiteurs non authentifiés y sont automatiquement redirigés. Avec au moins deux URL de connexion nommées, les visiteurs voient d'abord une page de sélection puis poursuivent vers le flux de connexion choisi. Mintlify transmet le paramètre `redirect` validé afin que le visiteur revienne à la page de documentation qu'il avait initialement demandée.
<Note>
Les URL de connexion multiples sont disponibles pour l'authentification JWT complète et partielle. La [personnalisation](/fr/create/personalization) JWT accepte une seule URL de connexion, car elle identifie les visiteurs sans exiger de connexion avant qu'ils puissent consulter le contenu public.
</Note>
<div id="jwt-example">
### Exemple JWT
</div>
Vous hébergez votre documentation sur `docs.foo.com` avec un système d'authentification existant sur `foo.com`. Vous voulez étendre votre flux de connexion pour accorder l'accès à la documentation tout en gardant votre documentation séparée de votre Dashboard (ou vous n'avez pas de Dashboard).
Créez un point de terminaison de connexion à `https://foo.com/docs-login` qui étend votre authentification existante.
Après vérification des identifiants de l'utilisateur :
* Générez un JWT avec les données utilisateur au format de Mintlify.
* Signez le JWT et redirigez vers `https://docs.foo.com/login/jwt-callback#{SIGNED_JWT}`.
<CodeGroup>
```ts TypeScript
import * as jose from 'jose';
import { Request, Response } from 'express';
const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2;
const DOCS_HOST = 'docs.example.com';
const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'EdDSA');
export async function handleRequest(req: Request, res: Response) {
const user = {
host: DOCS_HOST, // Doit correspondre à l'URL de votre documentation
expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000), // expiration de session de 2 semaines
groups: res.locals.user.groups,
apiPlaygroundInputs: {
header: {
"Authorization": `Bearer ${res.locals.user.apiKey}`,
},
},
};
const jwt = await new jose.SignJWT(user)
.setProtectedHeader({ alg: 'EdDSA' })
.setExpirationTime('10 s') // expiration du JWT de 10 secondes
.sign(signingKey);
return res.redirect(`https://${DOCS_HOST}/login/jwt-callback#${jwt}`);
}
```
```python Python
import jwt # pyjwt
import os
from datetime import datetime, timedelta
from fastapi.responses import RedirectResponse
private_key = os.getenv(MINTLIFY_JWT_PEM_SECRET_NAME, '')
DOCS_HOST = 'docs.example.com'
@router.get('/auth')
async def return_mintlify_auth_status(current_user):
jwt_token = jwt.encode(
payload={
'host': DOCS_HOST, # Doit correspondre à l'URL de votre documentation
'exp': int((datetime.now() + timedelta(seconds=10)).timestamp()), # expiration du JWT de 10 secondes
'expiresAt': int((datetime.now() + timedelta(weeks=2)).timestamp()), # expiration de session de 2 semaines
'groups': ['admin'] if current_user.is_admin else [],
'apiPlaygroundInputs': {
'header': {
'Authorization': f'Bearer {current_user.api_key}',
},
},
},
key=private_key,
algorithm='EdDSA'
)
return RedirectResponse(url=f'https://{DOCS_HOST}/login/jwt-callback#{jwt_token}', status_code=302)
```
</CodeGroup>
<div id="redirect-unauthenticated-users">
### Rediriger les utilisateurs non authentifiés
</div>
Lorsqu'un utilisateur non authentifié tente d'accéder à une page protégée, la redirection vers votre URL de connexion préserve la destination souhaitée par l'utilisateur.
1. Lutilisateur tente de visiter une page protégée : `https://docs.foo.com/quickstart`.
2. Redirection vers votre URL de connexion avec un paramètre de requête `redirect` : `https://foo.com/docs-login?redirect=%2Fquickstart`.
3. Après lauthentification, redirection vers `https://docs.foo.com/login/jwt-callback?redirect=%2Fquickstart#{SIGNED_JWT}`.
4. Lutilisateur arrive à sa destination dorigine.
</Tab>
</Tabs>
<div id="make-pages-public">
## Rendre des pages publiques
</div>
Lorsque vous utilisez lauthentification, toutes les pages nécessitent par défaut une authentification pour y accéder. Vous pouvez autoriser laccès à certaines pages sans authentification, au niveau de la page ou du groupe, à laide de la propriété `public`.
<div id="individual-pages">
### Pages individuelles
</div>
Pour rendre une page publique, ajoutez `public: true` au frontmatter de la page.
```mdx Public page example
---
title: "Page publique"
public: true
---
```
<div id="groups-of-pages">
### Groupes de pages
</div>
Pour rendre toutes les pages dun groupe publiques, ajoutez "public": true sous le nom du groupe dans lobjet `navigation` de votre `docs.json`.
```json Public group example
{
"navigation": {
"groups": [
{
"group": "Groupe public",
"public": true,
"icon": "play",
"pages": [
"quickstart",
"installation",
"settings"
]
},
{
"group": "Groupe privé",
"icon": "pause",
"pages": [
"private-information",
"secret-settings"
]
}
]
}
}
```
<div id="control-access-with-groups">
## Contrôler laccès avec des groupes
</div>
Lorsque vous utilisez lauthentification OAuth ou des JWT (JSON Web Tokens), vous pouvez restreindre certaines pages à des groupes dutilisateurs spécifiques. Cest utile si vous souhaitez que différents utilisateurs voient des contenus différents selon leur rôle ou leurs attributs.
Gérez les groupes via les données utilisateur transmises lors de lauthentification. Voir [Format des données utilisateur](#user-data-format) pour plus de détails.
```json Example user info
{
"groups": ["admin", "beta-users"],
"expiresAt": 1893456000
}
```
Indiquez quels groupes peuvent accéder à des pages spécifiques à laide de la propriété `groups` dans le frontmatter.
```mdx Example page restricted to the admin group highlight={3}
---
title: "Dashboard administrateur"
groups: ["admin"]
---
```
Les utilisateurs doivent appartenir à au moins un des groupes répertoriés pour accéder à la page. Si un utilisateur tente daccéder à une page sans le groupe requis, il recevra une erreur 404.
<div id="how-groups-interact-with-public-pages">
### Fonctionnement des groupes avec les pages publiques
</div>
* Par défaut, toutes les pages nécessitent une authentification.
* Les pages comportant une propriété `groups` ne sont accessibles quaux utilisateurs authentifiés appartenant à ces groupes.
* Les pages sans propriété `groups` sont accessibles à tous les utilisateurs authentifiés.
* Les pages avec `public: true` et sans propriété `groups` sont accessibles à tout le monde.
<CodeGroup>
```mdx Page publique
---
title: "Guide public"
public: true
---
```
```mdx Page protégée
---
title: "Référence API"
---
```
```mdx Page protégée avec groupes
---
title: "Configurations avancées"
groups: ["pro", "enterprise"]
---
```
</CodeGroup>
<div id="user-data-format">
## Format des données utilisateur
</div>
Lorsque vous utilisez lauthentification OAuth ou JWT, ou la personnalisation autonome, votre système renvoie des données utilisateur qui contrôlent la durée de la session et lappartenance à des groupes, ainsi que la [personnalisation du contenu](/fr/create/personalization).
<CodeGroup>
```tsx Format
type User = {
host?: string;
expiresAt?: number;
groups?: string[];
content?: Record<string, any>;
apiPlaygroundInputs?: {
server?: Record<string, string>;
header?: Record<string, unknown>;
query?: Record<string, unknown>;
cookie?: Record<string, unknown>;
path?: Record<string, unknown>;
};
};
```
```json Example
{
"host": "docs.example.com",
"expiresAt": 1893456000,
"groups": ["admin", "beta-users"],
"content": {
"firstName": "Jane",
"company": "Acme Corp"
},
"apiPlaygroundInputs": {
"header": {
"Authorization": "Bearer user_abc123"
},
"server": {
"baseUrl": "https://api.foo.com"
}
}
}
```
</CodeGroup>
<ParamField path="host" type="string">
**Requis pour lauthentification JWT.** Le nom dhôte de votre site de documentation. La chaîne doit correspondre exactement au domaine sur lequel vous déployez votre documentation. Mintlify valide que lhôte du JWT correspond à lhôte de la requête afin dempêcher la réutilisation du jeton sur différents sites.
</ParamField>
<ParamField path="expiresAt" type="number">
Heure dexpiration de la session, en secondes depuis lépoque Unix. Lorsque lheure actuelle dépasse cette valeur, Mintlify expire les données utilisateur stockées. Le visiteur doit alors sauthentifier à nouveau ou répéter le flux didentification pour les actualiser.
<Warning>**Pour les JWT :** cela diffère de la revendication `exp` dun JWT, qui détermine le moment où un JWT est considéré comme invalide. Par mesure de sécurité, définissez la revendication `exp` du JWT sur une durée courte (10 secondes ou moins). Utilisez `expiresAt` pour la durée réelle de la session (de quelques heures à plusieurs semaines).</Warning>
</ParamField>
<ParamField path="groups" type="string[]">
Liste des groupes auxquels lutilisateur appartient. Avec lauthentification, les pages dont le frontmatter contient un `groups` correspondant sont accessibles à cet utilisateur. Avec la personnalisation autonome, les groupes contrôlent la visibilité des pages et du contenu, mais ne restreignent pas laccès à lURL directe dune page.
**Exemple** : Un utilisateur avec `groups: ["admin", "engineering"]` correspond aux contenus étiquetés avec les groupes `admin` ou `engineering`.
</ParamField>
<ParamField path="content" type="Record<string, any>">
Données personnalisées accessibles dans les pages MDX via la variable `user` pour le [contenu personnalisé](/fr/create/personalization#dynamic-mdx-content).
</ParamField>
<ParamField path="apiPlaygroundInputs" type="object">
Préremplit les champs du bac à sable dAPI avec des valeurs propres à lutilisateur. Lorsquun utilisateur sauthentifie, ces valeurs renseignent les champs de saisie correspondants dans le bac à sable dAPI. Les utilisateurs peuvent remplacer les valeurs préremplies, et leurs remplacements sont conservés dans le stockage local.
Mintlify n'applique que les valeurs qui correspondent au schéma de sécurité du point de terminaison actuel.
<Expandable title="propriétés">
<ParamField path="header" type="Record<string, unknown>">
Valeurs den-tête à préremplir, indexées par nom den-tête.
</ParamField>
<ParamField path="query" type="Record<string, unknown>">
Valeurs de paramètres de requête à préremplir, indexées par nom de paramètre.
</ParamField>
<ParamField path="cookie" type="Record<string, unknown>">
Valeurs de cookie à préremplir, indexées par nom de cookie.
</ParamField>
<ParamField path="server" type="Record<string, string>">
Valeurs de variables de serveur à préremplir, indexées par nom de variable.
</ParamField>
<ParamField path="path" type="Record<string, unknown>">
Valeurs de paramètres de chemin à préremplir, indexées par nom de paramètre.
</ParamField>
</Expandable>
</ParamField>
<div id="feature-availability">
## Disponibilité des fonctionnalités
</div>
Certaines fonctionnalités se comportent différemment ou ne sont pas disponibles lorsque vous activez lauthentification. Mintlify ne prend pas en charge lhébergement de fichiers publics arbitraires sur un site authentifié. Tous les fichiers hébergés, y compris `llms.txt`, `llms-full.txt` et `skill.md`, sont soumis aux mêmes exigences dauthentification que vos pages de documentation.
| Fonctionnalité | Public | Entièrement authentifié (toutes les pages protégées) | Partiellement authentifié (certaines pages publiques) |
| :------------------------------------------------------- | :----------------------- | :--------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- |
| [llms.txt and llms-full.txt](/fr/ai/llmstxt) | Prise en charge complète | Disponible derrière lauthentification, les outils dIA peuvent donc ne pas avoir accès aux fichiers | Disponible derrière lauthentification, les outils dIA peuvent donc ne pas avoir accès aux fichiers |
| [MCP server](/fr/ai/model-context-protocol) | Prise en charge complète | Nécessite une authentification pour se connecter | Disponible sans authentification pour les pages publiques et avec authentification pour les pages protégées |
| [Markdown export](/fr/ai/markdown-export) | Prise en charge complète | Prise en charge complète, respecte les groupes dutilisateurs | Prise en charge complète, respecte les groupes dutilisateurs |
| [Export PDF](/fr/optimize/pdf-exports) | Prise en charge complète | Prise en charge complète, respecte les groupes d'utilisateurs. Les pages authentifiées sont exportées avec les images et les ressources incluses. | Prise en charge complète, respecte les groupes d'utilisateurs. Les pages authentifiées sont exportées avec les images et les ressources incluses. |
| [Search](/fr/assistant/index) | Prise en charge complète | Prise en charge complète, respecte les groupes dutilisateurs | Prise en charge complète, respecte les groupes dutilisateurs |
| [Assistant](/fr/assistant/index) | Prise en charge complète | Prise en charge complète, respecte les groupes dutilisateurs | Prise en charge complète, respecte les groupes dutilisateurs |
| [skill.md](/fr/ai/skillmd) | Prise en charge complète | Non pris en charge | Non pris en charge |
| [Sitemap](/fr/optimize/seo#sitemaps-and-robotstxt-files) | Prise en charge complète | Disponible derrière lauthentification, mais exclut les pages dans des groupes | Disponible derrière lauthentification, mais exclut les pages dans des groupes |
| [robots.txt](/fr/optimize/seo#sitemaps-and-robotstxt-files) | Prise en charge complète | Disponible derrière lauthentification | Disponible derrière lauthentification |
| [Aperçu en direct](/fr/editor/review#live-preview) | Prise en charge complète | Pris en charge avec authentification automatique de léditeur | Pris en charge avec authentification automatique de léditeur |