Protection par mot de passe
Verrouillez votre site ou quelques pages derrière un mot de passe partagé. Les visiteurs voient un écran de déverrouillage, le reste reste ouvert.
Il arrive que vous vouliez une documentation qui reste dans Git et en ligne, mais qui ne soit pas visible de tous. Exemples courants : runbooks, guides pré-lancement, documentation réservée aux partenaires et fonctionnalités en accès anticipé. La protection par mot de passe vous donne une phrase de passe partagée unique qui verrouille soit tout votre site, soit un ensemble spécifique de pages, sans rien déplacer hors de votre dépôt existant.
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 entier | Mode pages spécifiques | |
|---|---|---|
| À utiliser quand | Tout est privé : documentation d'ingénierie interne, copie de préproduction de votre site public, produit non publié. | La plupart des documents sont publics. Vous devez seulement masquer quelques pages (un runbook, une fonctionnalité bêta, une référence API interne). |
| Comment l'activer | Dé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 publiques | Oui : marquez des pages individuelles, groupes de navigation ou 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 du dashboard, le même écran de déverrouillage, ainsi que les mêmes contrôles de rotation et de révocation. Vous pouvez basculer entre les deux à tout moment en modifiant docs.json et en poussant vos changements.
Protéger tout votre site
Ouvrez votre docs.json et déclarez la protection du site entier. Le champ hint est facultatif mais fortement recommandé, car c'est le seul indice à l'écran que vos lecteurs obtiennent pour se procurer le mot de passe.
{
"$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 le drapeau d'activation et un indice facultatif.
Poussez le changement vers votre branche configurée. Jamdesk lance un build, et pendant celui-ci active la protection par mot de passe en mode site entier.
git add docs.json
git commit -m "Turn on password protection"
git pushUne fois le build terminé, la carte du dashboard passe de Off à Password not set, et le site renvoie 401 pour chaque page. Tant que vous n'avez pas défini de mot de passe, chaque requête est rejetée.

Ouvrez Project Settings dans le dashboard et faites défiler jusqu'à la carte Password Protection. Saisissez une phrase de passe forte (8 caractères minimum), puis cliquez sur Set password.
La carte bascule à l'état On. Toute personne disposant du mot de passe peut désormais parcourir le site ; toutes les autres personnes atterrissent sur l'écran de déverrouillage.

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 ni dans docs.json. Cela signifie aussi que Jamdesk ne peut pas vous l'envoyer par e-mail si vous l'oubliez. Faites plutôt une rotation.
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 mauvais mot de passe pour vérifier l'état d'erreur, puis le vrai 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. Sauvegardez 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 verrouillé. C'est ainsi que vous publiez une page d'atterrissage marketing ou un formulaire d'inscription à côté d'une documentation privée.
Vous disposez de trois façons de marquer une page comme publique, et elles fusionnent toutes dans la même liste d'autorisation à 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 toute une section à la fois. Définissez public: true sur un group ou un tab dans la navigation de votre docs.json, et chaque page qui en dépend devient publique. Pratique pour un onglet « Marketing » situé à côté d'une documentation d'ingénierie privée :
{
"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 : pages d'atterrissage de premier niveau, routes générées dynamiquement, ou toute une sous-arborescence que vous préférez ne pas réécrire.
{
"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 la liste d'autorisation résolue, afin que vous puissiez vérifier ce que le build a réellement pris en compte.
Protéger seulement quelques pages
Le mode pages spécifiques fonctionne à l'inverse : tout est public par défaut, et vous faites entrer individuellement des pages dans la protection.
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 verrouillés dans un seul fichier, ajoutez-les sous auth.password.private[] dans docs.json. Les deux approches sont cumulatives, vous pouvez donc les combiner.
{
"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.
Poussez vos changements. Le build suivant 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 le mode site entier.
git add content/runbook.mdx docs.json
git commit -m "Gate the incident runbook"
git pushOuvrez Project Settings, trouvez la carte Password Protection, et définissez une phrase de passe. L'en-tête de la carte affiche désormais On avec Specific pages au lieu de Whole site, et montre la liste des pages privées que le build a résolue, pour que vous puissiez l'auditer d'un coup d'œil.

Parcourez votre site de documentation normalement. Les pages publiques devraient se charger comme avant ; les pages privées devraient vous rediriger vers l'écran de déverrouillage. Une fois le mot de passe saisi, vous êtes connecté pendant 30 jours sur cet appareil et pouvez lire n'importe quelle page privée sans avoir à le retaper.
Ce que voient les visiteurs
Lorsque quelqu'un accède à une page verrouillée, il obtient une carte de déverrouillage centrée. Elle n'affiche que le nom du site et un indice facultatif, sans barre latérale ni navigation.

Les captures d'écran montrent l'interface en anglais.
La carte est habillée du logo et de la couleur principale de votre site, définis dans docs.json. Le champ mot de passe dispose d'un bouton pour révéler la saisie et bénéficie du focus automatique.
Les mots de passe erronés affichent la même carte avec un message d'erreur, un champ de saisie réinitialisé et un léger délai entre les tentatives. Un mot de passe incorrect et une requête sans mot de passe atterrissent tous deux sur le même écran, de sorte que rien sur la page ne distingue « mot de passe erroné » de « aucun mot de passe saisi pour l'instant ».

Une fois qu'un 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.
Rotation et révocation des sessions
Un mot de passe partagé doit finir par changer, par exemple après avoir circulé ou lorsqu'une personne quitte l'équipe.
Ouvrez la carte Password Protection, saisissez une nouvelle phrase de passe dans le champ Rotate password, et 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 souhaitez simplement forcer la déconnexion de toutes les sessions actives sans changer la phrase de passe (par exemple, 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 chaque cookie émis avant l'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 pousser vos changements.
- Site entier : supprimez
auth.password.enabled(ou définissez-le surfalse). - Pages spécifiques : supprimez chaque marqueur
private: trueet videzauth.password.private.
Au build suivant, Jamdesk supprime le hachage de mot de passe stocké et fait basculer la carte de nouveau à Off. Aucun état « dormant » ne subsiste. 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 verrouille 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 seule page peut être touchée par plusieurs signaux à la fois. L'ordre de résolution, du plus au moins spécifique :
- Si
auth.password.enabledvauttrue, tout le site est verrouillé.private: truesur des pages individuelles devient redondant. - Si une page est marquée à la fois
public: trueetprivate: true, public l'emporte. Le comportement par défaut le plus sûr est celui qui ne divulgue pas accidentellement une page. - Le frontmatter
public: true, lepublic: trued'un groupe de navigation, et les globsauth.password.public[]fusionnent tous dans une seule liste d'autorisation. 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 l'est. - Si
auth.password.private[]est défini mais queauth.password.enabledne 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 appliqués avant la vérification du hachage scrypt afin qu'une tentative de force brute ne puisse ni consommer de CPU ni divulguer 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 chemin de récupération n'existe.
Tester en développement local
jamdesk dev exécute votre documentation contre 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 verrouillées sans connaître le mot de passe. C'est délibéré : vous êtes l'auteur, vous avez déjà les clés du dépôt, et bloquer la prévisualisation locale derrière un mur de mot de passe serait une friction sans bénéfice de sécurité.
Si vous souhaitez vérifier la protection réelle, accédez au site déployé sur <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 vers docs.json et (2) défini un mot de passe dans Project Settings. Tant que la seconde étape n'est pas terminée, chaque requête renvoie 401 avec l'écran de déverrouillage comme corps de réponse, ce qui peut ressembler à un écran « qui n'apparaît pas » si vous attendiez une destination spécifique.
Son navigateur a un ancien cookie jd_auth_<slug> datant d'avant votre rotation. Attendez 30 jours que le cookie expire, cliquez sur Revoke all sessions dans le dashboard, ou demandez-lui d'effacer les cookies du domaine de documentation. Il sera invité à saisir le mot de passe actuel 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, divisez votre documentation en plusieurs projets (chacun avec son propre mot de passe), ou utilisez le mode pages spécifiques avec des frontières public/privé distinctes par audience.
Oui, dans les deux cas. 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 d'emblée : le formulaire de déverrouillage est soumis sous le préfixe de chemin /_jd/, que toute configuration de proxy documentée transmet déjà. Aucun changement de 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 /_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 verrouillée, de sorte que les robots d'exploration ne peuvent rien indexer derrière la protection. Les pages publiques d'un site protégé restent indexables normalement.
