Jamdesk Documentation logo

Protection par mot de passe

Verrouillez tout le site de docs ou des pages derrière un mot de passe partagé. Écran de déverrouillage pour les visiteurs ; le reste demeure accessible.

Il arrive que vous vouliez une documentation qui reste dans Git et en ligne, mais qui ne soit pas visible de tous. Voici des exemples courants : les runbooks, les guides pré-lancement, la documentation réservée aux partenaires et les fonctionnalités en accès anticipé. La protection par mot de passe vous donne une phrase secrète partagée unique qui verrouille soit l'ensemble de votre site, soit un ensemble spécifique de pages, sans rien déplacer hors de votre dépôt existant.

Les captures d'écran montrent l'interface en anglais.

Besoin d'une authentification par utilisateur ? Authentification JWT protège votre documentation avec votre propre système de connexion au lieu d'une phrase secrète partagée, avec des sessions par utilisateur et un accès aux pages basé sur des groupes.

Vous aurez besoin d'un projet Jamdesk connecté à un dépôt Git avant de pouvoir activer la protection par mot de passe. La configuration se trouve dans docs.json, donc la protection par mot de passe s'appuie sur votre flux habituel de build et de déploiement.

Quel mode choisir ?

Jamdesk propose deux modes de protection par mot de passe. Choisissez-en un selon ce qui est public et ce qui ne l'est pas.

Mode site entierMode pages spécifiques
À utiliser quandTout est privé : documentation d'ingénierie interne, copie de préproduction de votre site public, produit non publié.La plupart de la documentation est publique. Vous devez juste masquer quelques pages (un runbook, une fonctionnalité bêta, une référence API interne).
Comment l'activerDéfinissez auth.password.enabled: true dans docs.json.Marquez les pages comme privées avec private: true dans le frontmatter, ou listez les chemins sous auth.password.private[].
Exceptions publiquesOui : marquez des pages individuelles, des groupes de navigation ou des motifs glob comme publics.N/A. Chaque page est publique sauf si vous la marquez comme privée.

Les deux modes partagent la même carte dans le dashboard, le même écran de déverrouillage, et les mêmes contrôles de rotation et de révocation. Vous pouvez passer de l'un à l'autre à tout moment en modifiant docs.json et en poussant vos changements.

Protégez tout votre site

1
Ajoutez auth.password.enabled à docs.json

Ouvrez votre docs.json et déclarez la protection de tout le site. Le champ hint est optionnel mais fortement recommandé, car c'est le seul indice visible à l'écran que vos lecteurs obtiennent pour savoir comment obtenir le mot de passe.

docs.json
{
  "$schema": "https://jamdesk.com/docs.json",
  "name": "Acme Docs",
  "theme": "jam",
  "auth": {
    "password": {
      "enabled": true,
      "hint": "Ask #docs-access on Slack"
    }
  }
}

Les indices sont du texte brut, 200 caractères maximum, sans HTML.

Ne mettez pas le mot de passe lui-même dans docs.json. Vous définissez le mot de passe dans le dashboard après le build. Votre dépôt ne contient que l'indicateur d'activation et un indice optionnel.

2
Commit et push

Poussez la modification vers votre branche configurée. Jamdesk lance un build et, pendant ce build, active la protection par mot de passe en mode site entier.

git add docs.json
git commit -m "Turn on password protection"
git push

Une fois le build terminé, la carte du dashboard passe de Off à Password not set, et le site est verrouillé. Chaque page renvoie 401 et affiche l'écran de mot de passe, et aucun mot de passe ne fonctionne tant que vous n'en avez pas défini un. Les pages que vous avez rendues publiques restent accessibles, et les clés API du projet fonctionnent toujours pour l'API de recherche, le serveur MCP, les URL .md et les fichiers llms. Pour rendre tout le site public à nouveau, passez auth.password.enabled à false et faites un push.

Password Protection card showing 'Password not set' state with warning alert and Set password button

3
Définissez le mot de passe dans le dashboard

Ouvrez Project Settings dans le dashboard et faites défiler jusqu'à la carte Password Protection. Saisissez une phrase secrète forte (8 caractères minimum), puis cliquez sur Set password.

La carte passe à l'état On. Toute personne disposant du mot de passe peut désormais parcourir le site ; tous les autres arrivent sur l'écran de déverrouillage.

Password Protection card in On state showing rotate form, Revoke all sessions button, and disable instructions

Jamdesk ne stocke jamais votre mot de passe en clair. Il est haché avec scrypt dans la base de données du dashboard et n'est jamais écrit dans votre dépôt ou dans docs.json. Cela signifie aussi que Jamdesk ne peut pas vous l'envoyer par e-mail si vous l'oubliez. Faites une rotation à la place.

4
Vérifiez le verrouillage

Ouvrez votre site de documentation dans une fenêtre de navigation privée (ou utilisez curl) et vérifiez que vous obtenez l'écran de déverrouillage. Essayez un mot de passe erroné pour vérifier l'état d'erreur, puis le bon pour accéder au site.

# Should respond with HTTP/1.1 401 and the unlock HTML
curl -I https://acme.jamdesk.app/

# Submit the password. On success, sets the jd_auth_<slug> cookie.
curl -i -X POST https://acme.jamdesk.app/jd/unlock \
  -d "password=your-passphrase&from=/"

Un déverrouillage réussi renvoie une redirection 303 avec un en-tête Set-Cookie: jd_auth_acme=...; HttpOnly; Secure; SameSite=Lax; Max-Age=2592000. Enregistrez ce cookie pour la requête suivante et vous êtes connecté.

Exceptions publiques

Le mode site entier dispose d'une échappatoire : vous pouvez garder certaines pages publiques même si le reste du site est protégé. C'est ainsi que vous pouvez publier une landing page marketing ou un formulaire d'inscription à côté de documentation privée.

Vous disposez de trois façons de marquer une page comme publique, et elles fusionnent toutes dans la même allow-list à chaque build.

Le frontmatter est l'option la plus granulaire. Ajoutez public: true à n'importe quel fichier .mdx et seule cette page échappe à la protection :

---
title: Get started
public: true
---

Les groupes de navigation couvrent une section entière en une fois. Définissez public: true sur un group ou un tab dans la navigation de votre docs.json, et toutes les pages en dessous deviennent publiques. Pratique pour un tab « Marketing » qui se trouve à côté de documentation d'ingénierie privée :

docs.json
{
  "navigation": {
    "tabs": [
      {
        "tab": "Marketing",
        "public": true,
        "groups": [
          {
            "group": "Overview",
            "pages": ["landing", "pricing", "changelog"]
          }
        ]
      },
      {
        "tab": "Internal",
        "groups": [
          { "group": "Runbooks", "pages": ["deploys", "oncall"] }
        ]
      }
    ]
  }
}

Les globs explicites sous auth.password.public[] gèrent tout ce que le frontmatter et la navigation ne peuvent pas couvrir : pages d'accueil de premier niveau, routes générées dynamiquement, ou une sous-arborescence entière que vous préférez ne pas réécrire.

docs.json
{
  "auth": {
    "password": {
      "enabled": true,
      "hint": "Ask #docs-access on Slack",
      "public": [
        "/landing",
        "/pricing",
        "/marketing/**",
        "/blog/*"
      ]
    }
  }
}

Les globs prennent en charge * (un segment de chemin) et ** (n'importe quelle profondeur). Un simple / est rejeté lors de la validation : si Jamdesk l'acceptait, une seule faute de frappe pourrait déverrouiller silencieusement tout votre site. Après chaque build, la carte du dashboard affiche l'allow-list résolue, afin que vous puissiez vérifier ce que le build a réellement pris en compte.

Protégez seulement quelques pages

Le mode pages spécifiques suit le workflow inverse : tout est public par défaut, et vous choisissez individuellement les pages à protéger.

1
Marquez une page comme privée

Ajoutez private: true au frontmatter de la page. C'est l'option la plus simple lorsque la décision revient à la personne propriétaire de la page.

---
title: Incident Runbook
description: What to do when the deploys dashboard is on fire.
private: true
---

Ou, si vous préférez garder la liste des chemins protégés dans un seul fichier, ajoutez-les sous auth.password.private[] dans docs.json. Les deux approches sont cumulatives, vous pouvez donc les combiner.

docs.json
{
  "auth": {
    "password": {
      "hint": "Ask the on-call engineer",
      "private": ["/admin/runbook", "/internal/api-keys"]
    }
  }
}

Remarquez qu'il n'y a pas de enabled: true. Définir auth.password.private[] sans enabled est ce qui active automatiquement le mode pages spécifiques.

2
Commit et push

Poussez vos modifications. Le prochain build détecte les pages privées, active la protection en mode pages spécifiques, et affiche l'invite du dashboard pour définir un mot de passe, exactement comme pour le mode site entier.

git add content/runbook.mdx docs.json
git commit -m "Gate the incident runbook"
git push
3
Définissez le mot de passe

Ouvrez Project Settings, trouvez la carte Password Protection, et définissez une phrase secrète. L'en-tête de la carte affiche désormais On avec Specific pages au lieu de Whole site, et elle affiche la liste des pages privées résolues par le build afin que vous puissiez l'auditer en un coup d'œil.

Password Protection card in specific-pages mode with three private paths listed and updated disable instructions

4
Vérifiez le verrouillage

Parcourez votre site de documentation normalement. Les pages publiques doivent se charger comme avant ; les pages privées doivent vous rediriger vers l'écran de déverrouillage. Une fois le mot de passe saisi, vous restez connecté pendant 30 jours sur cet appareil et pouvez lire n'importe quelle page privée sans le ressaisir.

Ce que voient les visiteurs

Lorsqu'une personne accède à une page protégée, elle obtient une carte de déverrouillage centrée. Celle-ci n'affiche que le nom du site et un indice optionnel, sans barre latérale ni navigation.

ACME unlock screen with site name, lock icon, password field, and hint text below

La carte est personnalisée avec le logo de votre site et la couleur principale définie dans docs.json. Le champ de mot de passe dispose d'un bouton pour afficher le mot de passe et de l'autofocus.

Un mot de passe incorrect affiche la même carte avec un message d'erreur, un champ vide et un léger délai entre les tentatives. Un mot de passe incorrect et une requête sans mot de passe aboutissent tous deux au même écran, si bien que rien sur la page ne distingue « mot de passe incorrect » de « aucun mot de passe saisi pour l'instant ».

Unlock screen after a failed attempt, with 'Incorrect password. Please try again.' in red

Une fois que le visiteur saisit le bon mot de passe, il reçoit un cookie signé et peut naviguer normalement jusqu'à l'expiration de la session ou jusqu'à ce que vous la révoquiez.

Outils d'IA et clés API

Les outils qui ne peuvent pas saisir le mot de passe, comme un client MCP ou un script qui récupère llms.txt, peuvent utiliser une clé API du projet à la place. La clé fonctionne pour le serveur MCP, les URL de pages .md et les fichiers llms. Elle n'ouvre jamais les pages HTML ni le chat IA.

Rotation et révocation des sessions

Un mot de passe partagé doit finir par changer, par exemple après avoir circulé ou quand quelqu'un quitte l'équipe.

Ouvrez la carte Password Protection, saisissez une nouvelle phrase secrète dans le champ Rotate password, puis cliquez sur Save new password. Toute personne disposant de l'ancien mot de passe est bloquée dès sa prochaine requête ; toute personne disposant du nouveau mot de passe peut entrer. La rotation prend effet immédiatement et ne nécessite pas de nouveau build.

Si vous voulez simplement forcer la déconnexion de toutes les sessions actives sans changer la phrase secrète (par exemple, si l'ordinateur portable de quelqu'un a disparu), cliquez plutôt sur Revoke all sessions. Cela incrémente un compteur de version côté serveur, ce qui invalide tous les cookies émis avant cet incrément. Les visiteurs ressaisissent le mot de passe actuel et peuvent revenir.

Désactiver la protection

La protection est pilotée par docs.json, donc la désactiver signifie modifier le fichier et le pousser.

  • Site entier : supprimez auth.password.enabled (ou définissez-le sur false).
  • Pages spécifiques : supprimez tous les marqueurs private: true et videz auth.password.private.

Au prochain build, Jamdesk supprime le hash du mot de passe stocké et fait repasser la carte à Off. Aucun état « dormant » ne persiste. Si vous réactivez la protection plus tard, vous devrez choisir un nouveau mot de passe.

Votre dépôt source n'est pas protégé par mot de passe. La protection par mot de passe protège le site de documentation hébergé sur *.jamdesk.app (ou votre domaine personnalisé). Si votre dépôt GitHub est public, le contenu MDX y reste lisible. Rendez le dépôt privé si vous avez besoin d'une protection complète du contenu.

Règles de priorité

Une même page peut être concernée par plusieurs signaux à la fois. L'ordre de résolution, du plus spécifique au moins spécifique :

  • Si auth.password.enabled vaut true, tout le site est protégé. private: true sur des pages individuelles devient redondant.
  • Si une page est marquée à la fois public: true et private: true, c'est public qui l'emporte. Le comportement par défaut le plus sûr est celui qui évite de divulguer accidentellement une page.
  • Le public: true du frontmatter, le public: true d'un groupe de navigation, et les globs auth.password.public[] fusionnent tous dans une seule allow-list. Il n'y a pas de règle « le plus spécifique l'emporte ». Si un seul signal indique qu'une page est publique, elle est publique.
  • Si auth.password.private[] est défini mais que auth.password.enabled ne l'est pas, Jamdesk active automatiquement le mode pages spécifiques. Vous n'avez rien d'autre à faire.

Fonctionnement des sessions et de la limitation de débit

Cette section couvre le cookie de session, les limites de débit et le stockage du mot de passe.

Le cookie de session. Lors d'un déverrouillage réussi, Jamdesk définit un cookie nommé jd_auth_<slug> (par exemple, jd_auth_acme). Il est HttpOnly, Secure, SameSite=Lax, limité à l'hôte, et signé avec HMAC-SHA256. La charge utile inclut le slug du projet, le compteur de version actuel, et un horodatage d'expiration, de sorte que toute altération échoue à la validation. La durée de vie par défaut est de 30 jours, renouvelée à chaque déverrouillage réussi.

Limitation de débit. L'endpoint de déverrouillage applique deux compteurs par heure : 10 tentatives par IP et 100 tentatives par projet. Les deux sont vérifiés avant le calcul du hash scrypt, afin qu'une tentative de force brute ne puisse pas consommer du CPU ni fuiter d'informations de timing. Atteindre l'une ou l'autre limite renvoie 429 Too Many Requests avec un en-tête Retry-After.

Stockage. Votre mot de passe est haché avec scrypt et stocké dans le Firestore du dashboard. Il n'atterrit jamais dans votre dépôt, votre docs.json, ou un artefact de build. Si vous le perdez, faites une rotation. Aucun moyen de récupération n'existe.

Tester en développement local

jamdesk dev exécute votre documentation avec le contenu R2 en direct et la configuration en direct. La protection par mot de passe n'est pas appliquée dans le serveur de développement local, ce qui vous permet de prévisualiser les pages protégées sans connaître le mot de passe. C'est volontaire : vous êtes l'auteur, vous avez déjà les clés du dépôt, et bloquer l'aperçu local derrière un mur de mot de passe serait une friction sans bénéfice de sécurité.

Si vous voulez vérifier la protection réelle, accédez au site déployé à l'adresse <slug>.jamdesk.app (ou votre domaine personnalisé) depuis une fenêtre de navigateur qui n'a pas encore le cookie.

Dépannage

La carte du dashboard affiche probablement Password not set. La protection ne s'active que lorsque vous avez à la fois (1) poussé la configuration dans docs.json et (2) défini un mot de passe dans Project Settings. Tant que la deuxième étape n'est pas terminée, chaque requête renvoie 401 avec l'écran de déverrouillage comme contenu, ce qui peut donner l'impression que l'écran « n'apparaît pas » si vous attendiez une destination précise.

Son navigateur a un ancien cookie jd_auth_<slug> datant d'avant votre rotation. Soit vous attendez 30 jours que le cookie expire, soit vous cliquez sur Revoke all sessions dans le dashboard, soit vous lui demandez d'effacer les cookies du domaine de la documentation. Le mot de passe actuel lui sera demandé lors de sa prochaine visite.

Pas directement. Jamdesk utilise un seul mot de passe partagé par site. Si vous avez besoin d'un accès par groupe, répartissez votre documentation en plusieurs projets (chacun avec son propre mot de passe) ou utilisez le mode pages spécifiques avec des limites public/privé distinctes par audience.

Oui aux deux. Le cookie de déverrouillage est lié à l'hôte, donc chaque hôte (le sous-domaine *.jamdesk.app et votre domaine personnalisé) s'authentifie indépendamment. Les lecteurs qui déverrouillent un hôte ne seront pas préauthentifiés sur l'autre.

Les configurations en sous-chemin (documentation sur yoursite.com/docs derrière votre propre proxy) fonctionnent sans configuration supplémentaire : le formulaire de déverrouillage est soumis sous le préfixe de chemin /_jd/, que toute configuration de proxy documentée transmet déjà. Aucune modification du proxy n'est nécessaire lorsque vous activez ou désactivez la protection par mot de passe.

Si votre proxy a été configuré avant que le transfert de /_jd/ fasse partie du guide de configuration, ajoutez /_jd/* à ses chemins transférés.

Non. Les sites protégés définissent noindex, nofollow sur l'écran de déverrouillage et renvoient 401 pour chaque page protégée, de sorte que les robots d'indexation ne peuvent rien indexer derrière la protection. Les pages publiques à l'intérieur d'un site protégé restent indexables normalement.

Et ensuite ?

Vue d'ensemble du contrôle d'accès

Comparez la protection par mot de passe au SSO et au pattern multi-projets.

Authentification JWT

Remplacez la phrase secrète partagée par des sessions par utilisateur issues de votre propre système de connexion.

SSO (Enterprise)

Remplacez les phrases secrètes partagées par une connexion par utilisateur via votre fournisseur d'identité.

Domaines personnalisés

Mettez votre documentation sur votre propre domaine avant de partager le lien.

Schéma auth.password

Référence complète des champs enabled, hint, public, et private.