Jamdesk Documentation logo

Protection par mot de passe

Verrouillez l'intégralité de votre site de documentation ou seulement quelques pages avec un mot de passe partagé. Les visiteurs voient un écran de déverrouillage ; le reste de votre documentation reste accessible.

Parfois vous souhaitez que votre documentation soit en ligne, accessible, versionnée dans Git, mais pas visible par tout le monde. Runbooks, guides pré-lancement, docs réservées aux partenaires, fonctionnalités en accès anticipé. La protection par mot de passe vous donne une phrase secrète partagée unique qui protège soit l'ensemble de votre site, soit un ensemble spécifique de pages, sans rien déplacer de votre dépôt existant.

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

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 normal de build et déploiement.

Quel mode choisir ?

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

Mode site entierMode pages spécifiques
À utiliser quandTout est privé : docs d'ingénierie internes, une copie de staging de votre site public, un produit non lancé.La plupart des docs sont publiques. Vous avez juste besoin de cacher 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 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 privée.

Les deux modes partagent la même carte dashboard, le même écran de déverrouillage, et les mêmes contrôles de rotation et révocation. Vous pouvez basculer entre eux à tout moment en modifiant docs.json et en poussant.

Protéger l'ensemble de votre site

1
Ajouter auth.password.enabled à docs.json

Ouvrez votre docs.json et déclarez la protection de l'ensemble du site. Le champ hint est optionnel mais fortement recommandé, car c'est le seul indice à l'écran que vos lecteurs obtiennent sur la façon d'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 indications sont en 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 flag d'activation et un indice optionnel.

2
Committer et pousser

Poussez le changement vers votre branche configurée. Jamdesk exécute un build, et pendant ce build il active la protection par mot de passe en mode site entier.

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

Pendant que vous tapiez, la carte dashboard a basculé de Off à Password not set, et votre site a commencé à retourner 401 pour chaque page. Jusqu'à ce que vous définissiez un mot de passe, chaque requête est rejetée. La porte est fermée et n'a pas encore de clé.

Carte Password Protection affichant l'état 'Password not set' avec une alerte d'avertissement et un bouton Set password

3
Définir 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 robuste (minimum 8 caractères), puis cliquez sur Set password.

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

Carte Password Protection en état On affichant le formulaire de rotation, le bouton Revoke all sessions et les instructions de désactivation

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 également que Jamdesk ne peut pas vous l'envoyer par email si vous l'oubliez. Effectuez une rotation à la place.

4
Vérifier la protection

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

# 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 retourne 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 porte de sortie : vous pouvez garder des pages spécifiques publiques même si le reste du site est protégé. C'est ainsi que vous publiez une page d'accueil marketing ou un formulaire d'inscription à côté de docs privées.

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 uniquement cette page échappe à la protection :

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

Les groupes de navigation couvrent une section entière d'un coup. Définissez public: true sur un group ou un tab dans votre navigation docs.json, et chaque page sous celui-ci est publique. Pratique pour un onglet "Marketing" qui se trouve à côté de docs d'ingénierie privées :

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 : les pages d'accueil de premier niveau, les routes générées dynamiquement, ou un sous-arbre entier 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 supportent * (un segment de chemin) et ** (n'importe quelle profondeur). Un simple / est rejeté à la validation : si Jamdesk l'honorait, une seule faute de frappe pourrait silencieusement déverrouiller l'ensemble de votre site. Après chaque build, la carte dashboard affiche la liste d'autorisation résolue, afin que vous puissiez vérifier ce que le build a réellement capturé.

Protéger seulement quelques pages

Le mode pages spécifiques est le flux de travail inverse : tout est public par défaut, et vous optez individuellement les pages dans la protection.

1
Marquer une page comme privée

Ajoutez private: true au frontmatter de la page. C'est l'option la plus facile quand la décision appartient à celui qui possè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 additives, vous pouvez donc les mélanger.

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

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

2
Committer et pousser

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

git add content/runbook.mdx docs.json
git commit -m "Gate the incident runbook"
git push
3
Définir 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 maintenant On avec Specific pages au lieu de Whole site, et elle montre la liste des pages privées que le build a résolues afin que vous puissiez l'auditer d'un coup d'œil.

Carte Password Protection en mode pages spécifiques avec trois chemins privés listés et les instructions de désactivation mises à jour

4
Vérifier la protection

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 que vous avez saisi le mot de passe, vous êtes connecté pour 30 jours sur cet appareil et pouvez lire n'importe quelle page privée sans le saisir à nouveau.

Ce que voient les visiteurs

Quand quelqu'un arrive sur une page protégée, il voit une carte de déverrouillage centrée sans barre latérale, sans chrome, et sans indication de ce qui se trouve derrière la porte en dehors du nom du site et d'un indice optionnel.

Écran de déverrouillage ACME avec le nom du site, une icône de cadenas, un champ de mot de passe, et le texte d'indice en dessous

La carte est personnalisée avec le logo et la couleur principale de votre site depuis docs.json. Le champ de mot de passe dispose d'un bouton de révélation et est mis en focus automatiquement.

Les mauvais mots de passe affichent la même carte avec un message d'erreur, un nouveau champ de saisie, et un petit 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, donc rien sur la page ne distingue "mot de passe erroné" de "aucun mot de passe saisi encore".

Écran de déverrouillage après une tentative échouée, avec 'Incorrect password. Please try again.' en rouge

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évoquez.

Rotation et révocation des sessions

Les mots de passe se partagent. Les gens partent. Vous voudrez le changer à un moment donné.

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

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 sur Revoke all sessions à la place. Cela incrémente un compteur de version côté serveur, ce qui invalide tous les cookies émis avant l'incrémentation. Les visiteurs saisissent à nouveau le mot de passe actuel et peuvent se reconnecter.

Désactiver la protection

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

  • Site entier : supprimez auth.password.enabled (ou définissez-le à false).
  • Pages spécifiques : supprimez chaque marqueur private: true et videz auth.password.private.

Au prochain build, Jamdesk supprime le hash du mot de passe stocké et remet la carte sur 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 est toujours 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 spécifique au moins spécifique :

  • Si auth.password.enabled est true, l'ensemble du 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, public l'emporte. La valeur par défaut la plus sûre est celle qui n'expose pas accidentellement une page.
  • Le frontmatter public: true, le nav-group public: true, et les globs auth.password.public[] fusionnent tous dans une seule liste d'autorisation. Pas de règle "le plus spécifique l'emporte". Si un signal dit qu'une page est publique, elle est publique.
  • Si auth.password.private[] est défini mais pas auth.password.enabled, Jamdesk active le mode pages spécifiques automatiquement. Vous n'avez rien d'autre à faire.

Fonctionnement des sessions et de la limitation de débit

Trois questions reviennent avec tout nouveau système d'authentification.

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 laisser fuir des informations de timing. Atteindre l'une ou l'autre limite retourne 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, ni dans un artefact de build. Si vous le perdez, effectuez une rotation. Aucun chemin de récupération n'existe.

Test pendant le 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, vous pouvez donc prévisualiser les pages protégé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 le preview local sur un 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é 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 dashboard affiche probablement Password not set. La protection ne s'active pas jusqu'à ce que vous ayez à la fois (1) poussé la configuration dans docs.json et (2) défini un mot de passe dans Project Settings. Jusqu'à ce que la deuxième étape soit complète, chaque requête retourne 401 avec l'écran de déverrouillage comme corps, ce qui peut sembler que l'écran "n'apparaît pas" si vous attendiez une destination spécifique.

Son navigateur a un ancien cookie jd_auth_<slug> d'avant votre rotation. Soit attendez 30 jours que le cookie expire, cliquez sur Revoke all sessions dans le dashboard, ou demandez-lui de vider les cookies pour le domaine de la documentation. Il lui sera demandé 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 publiques/privées séparées par audience.

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

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

Étape suivante

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 pour enabled, hint, public, et private.