Jamdesk Documentation logo

Protección con contraseña

Protege todo tu sitio o solo algunas páginas con una contraseña compartida. Los visitantes ven una pantalla de desbloqueo; el resto queda abierto.

A veces quieres documentación que permanezca en Git y en línea pero que no sea visible para todos. Ejemplos comunes incluyen runbooks, guías de prelanzamiento, documentación exclusiva para partners y funciones de acceso anticipado. La protección con contraseña te da una única frase de contraseña compartida que restringe el acceso a todo tu sitio o a un conjunto específico de páginas, sin mover nada fuera de tu repositorio existente.

Necesitarás un proyecto Jamdesk conectado a un repositorio de Git antes de poder activar la protección con contraseña. La configuración vive en docs.json, así que la protección con contraseña aprovecha tu flujo normal de build y despliegue.

¿Qué modo debo elegir?

Jamdesk tiene dos modos para la protección con contraseña. Elige uno según qué sea público y qué no.

Modo de sitio completoModo de páginas específicas
Úsalo cuandoTodo es privado: documentación interna de ingeniería, una copia en staging de tu sitio público, un producto aún no lanzado.La mayoría de la documentación es pública. Solo necesitas ocultar algunas páginas (un runbook, una función beta, una referencia de API interna).
Cómo lo activasConfigura auth.password.enabled: true en docs.json.Marca páginas como privadas con private: true en el frontmatter, o lista rutas bajo auth.password.private[].
Excepciones públicasSí: marca páginas individuales, grupos de navegación o patrones glob como públicos.N/A. Todas las páginas son públicas a menos que las marques como privadas.

Ambos modos comparten la misma tarjeta del dashboard, la misma pantalla de desbloqueo y los mismos controles de rotación y revocación. Puedes cambiar entre ellos en cualquier momento editando docs.json y haciendo push.

Protege todo tu sitio

1
Agrega auth.password.enabled a docs.json

Abre tu docs.json y declara la protección de sitio completo. El campo hint es opcional pero muy recomendable, ya que es la única pista en pantalla que tus lectores reciben sobre cómo obtener la contraseña.

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

Las pistas son texto plano, máximo 200 caracteres, sin HTML.

No pongas la contraseña en sí en docs.json. Estableces la contraseña en el dashboard después del build. Tu repositorio solo contiene el indicador de activación y una pista opcional.

2
Haz commit y push

Sube el cambio a tu rama configurada. Jamdesk ejecuta un build, y durante el build activa la protección con contraseña en modo de sitio completo.

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

Después de que se complete el build, la tarjeta del dashboard cambia de Off a Password not set, y el sitio devuelve 401 para cada página. Hasta que establezcas una contraseña, cada solicitud es rechazada.

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

3
Establece la contraseña en el dashboard

Abre Project Settings en el dashboard y desplázate hasta la tarjeta Password Protection. Escribe una frase de contraseña segura (mínimo 8 caracteres) y luego haz clic en Set password.

La tarjeta cambia al estado On. Todos los que tengan la contraseña ahora pueden navegar el sitio; el resto llega a la pantalla de desbloqueo.

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

Jamdesk nunca almacena tu contraseña en texto plano. Se aplica hash con scrypt en la base de datos del dashboard y nunca se escribe en tu repositorio ni en docs.json. Eso también significa que Jamdesk no puede enviártela por correo si la olvidas. Rota la contraseña en su lugar.

4
Verifica el bloqueo

Abre tu sitio de documentación en una ventana de navegador privada (o hazle curl) y confirma que obtienes la pantalla de desbloqueo. Prueba una contraseña incorrecta para revisar el estado de error, y luego la correcta para entrar.

# 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 desbloqueo exitoso devuelve una redirección 303 con un encabezado Set-Cookie: jd_auth_acme=...; HttpOnly; Secure; SameSite=Lax; Max-Age=2592000. Guarda esa cookie para la siguiente solicitud y estarás dentro.

Excepciones públicas

El modo de sitio completo tiene una vía de escape: puedes mantener páginas específicas públicas incluso mientras el resto del sitio está restringido. Así es como publicas una landing page de marketing o un formulario de registro junto a documentación privada.

Tienes tres formas de marcar una página como pública, y todas se combinan en la misma lista de permitidos en cada build.

El frontmatter es la opción más granular. Agrega public: true a cualquier archivo .mdx y solo esa página escapa del bloqueo:

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

Los grupos de navegación cubren toda una sección a la vez. Configura public: true en un group o tab en la navegación de tu docs.json, y cada página debajo de él es pública. Útil para una pestaña "Marketing" que está junto a documentación interna de ingeniería privada:

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

Los globs explícitos bajo auth.password.public[] manejan todo lo que el frontmatter y la navegación no pueden: landing pages de nivel superior, rutas generadas dinámicamente, o un subárbol completo que prefieras no reescribir.

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

Los globs admiten * (un segmento de ruta) y ** (cualquier profundidad). Un / simple se rechaza en la validación: si Jamdesk lo honrara, un solo error tipográfico podría desbloquear silenciosamente todo tu sitio. Después de cada build, la tarjeta del dashboard muestra la lista de permitidos resuelta, para que puedas verificar qué recogió realmente el build.

Protege solo algunas páginas

El modo de páginas específicas es el flujo de trabajo opuesto: todo es público por defecto, y tú incluyes páginas individuales en el bloqueo.

1
Marca una página como privada

Agrega private: true al frontmatter de la página. Esta es la opción más fácil cuando la decisión recae en quien sea dueño de la página.

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

O, si prefieres mantener la lista de rutas restringidas en un solo archivo, agrégalas bajo auth.password.private[] en docs.json. Ambos enfoques son aditivos, así que puedes combinarlos.

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

Nota que no hay enabled: true. Configurar auth.password.private[] sin enabled es lo que activa automáticamente el modo de páginas específicas.

2
Haz commit y push

Sube tus cambios. El siguiente build detecta las páginas privadas, activa la protección en modo de páginas específicas, y muestra el aviso del dashboard para establecer una contraseña, exactamente igual que el modo de sitio completo.

git add content/runbook.mdx docs.json
git commit -m "Gate the incident runbook"
git push
3
Establece la contraseña

Abre Project Settings, busca la tarjeta Password Protection y establece una frase de contraseña. El encabezado de la tarjeta ahora dice On con Specific pages en lugar de Whole site, y muestra la lista de páginas privadas que resolvió el build para que puedas auditarla de un vistazo.

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

4
Verifica el bloqueo

Navega tu sitio de documentación normalmente. Las páginas públicas deberían cargar como antes; las páginas privadas deberían redirigirte a la pantalla de desbloqueo. Una vez que ingreses la contraseña, quedas conectado durante 30 días en ese dispositivo y puedes leer cualquier página privada sin escribirla de nuevo.

Lo que ven los visitantes

Las capturas de pantalla muestran la interfaz en inglés.

Cuando alguien llega a una página restringida, ve una tarjeta de desbloqueo centrada. Muestra solo el nombre del sitio y una pista opcional, sin barra lateral ni navegación.

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

La tarjeta lleva la marca del logo y el color primario de tu sitio desde docs.json. El campo de contraseña tiene un botón para mostrarla y autofocus.

Las contraseñas incorrectas muestran la misma tarjeta con un mensaje de error, un campo nuevo y un pequeño retraso entre intentos. Una contraseña incorrecta y una solicitud sin contraseña llegan a la misma pantalla, así que nada en la página distingue "contraseña incorrecta" de "aún no se ingresó contraseña".

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

Una vez que un visitante ingresa la contraseña correcta, recibe una cookie firmada y puede navegar con normalidad hasta que la sesión expire o la revoques.

Rotación y revocación de sesiones

Una contraseña compartida eventualmente necesita cambiar, por ejemplo después de haber sido compartida ampliamente o cuando alguien deja el equipo.

Abre la tarjeta Password Protection, escribe una nueva frase de contraseña en el campo Rotate password y haz clic en Save new password. Todos los que tengan la contraseña anterior quedan bloqueados en su siguiente solicitud; todos los que tengan la nueva pueden entrar. La rotación surte efecto de inmediato y no requiere un nuevo build.

Si solo quieres forzar el cierre de sesión de todas las sesiones activas sin cambiar la frase de contraseña (por ejemplo, si se perdió la laptop de alguien), haz clic en Revoke all sessions en su lugar. Esto incrementa un contador de versión del lado del servidor, que invalida toda cookie emitida antes del incremento. Los visitantes vuelven a ingresar la contraseña actual y entran de nuevo.

Desactivar la protección

La protección se controla mediante docs.json, así que desactivarla significa editar el archivo y hacer push.

  • Sitio completo: elimina auth.password.enabled (o configúralo como false).
  • Páginas específicas: elimina todo marcador private: true y borra auth.password.private.

En el siguiente build, Jamdesk elimina el hash de contraseña almacenado y vuelve a poner la tarjeta en Off. No queda ningún estado "latente". Si vuelves a activar la protección más tarde, tendrás que elegir una contraseña nueva.

Tu repositorio fuente no está protegido con contraseña. La protección con contraseña restringe el sitio de documentación alojado en *.jamdesk.app (o tu dominio personalizado). Si tu repositorio de GitHub es público, el contenido MDX sigue siendo legible ahí. Haz privado el repositorio si necesitas protección completa del contenido.

Reglas de precedencia

Una sola página puede verse afectada por varias señales a la vez. El orden de resolución, de más a menos específico:

  • Si auth.password.enabled es true, todo el sitio queda restringido. private: true en páginas individuales se vuelve redundante.
  • Si una página está marcada tanto como public: true como private: true, gana public. El valor predeterminado más seguro es el que no filtra una página por accidente.
  • El frontmatter public: true, el public: true de grupo de navegación y los globs de auth.password.public[] se combinan en una sola lista de permitidos. No hay regla de "el más específico gana". Si alguna señal dice que una página es pública, es pública.
  • Si auth.password.private[] está configurado pero auth.password.enabled no lo está, Jamdesk activa automáticamente el modo de páginas específicas. No necesitas hacer nada más.

Cómo funcionan las sesiones y la limitación de velocidad

Esta sección cubre la cookie de sesión, los límites de velocidad y el almacenamiento de contraseñas.

La cookie de sesión. Al desbloquear con éxito, Jamdesk establece una cookie llamada jd_auth_<slug> (por ejemplo, jd_auth_acme). Es HttpOnly, Secure, SameSite=Lax, limitada al host, y firmada con HMAC-SHA256. El payload incluye el slug del proyecto, el contador de versión actual y una marca de tiempo de expiración, así que cualquier manipulación falla la validación. La vida útil predeterminada es de 30 días, y se renueva en cada desbloqueo exitoso.

Limitación de velocidad. El endpoint de desbloqueo aplica dos contadores por hora: 10 intentos por IP y 100 intentos por proyecto. Ambos se aplican antes de la verificación del hash scrypt, así que un intento de fuerza bruta no puede consumir CPU ni filtrar información de tiempo. Alcanzar cualquiera de los dos límites devuelve 429 Too Many Requests con un encabezado Retry-After.

Almacenamiento. Tu contraseña se protege con hash scrypt y se almacena en el Firestore del dashboard. Nunca llega a tu repositorio, a tu docs.json ni a un artefacto de build. Si la pierdes, rótala. No existe una ruta de recuperación.

Pruebas durante el desarrollo local

jamdesk dev ejecuta tu documentación contra el contenido en vivo de R2 y la configuración en vivo. La protección con contraseña no se aplica en el servidor de desarrollo local, así que puedes previsualizar páginas restringidas sin conocer la contraseña. Esto es deliberado: tú eres el autor, ya tienes las llaves del repositorio, y bloquear la vista previa local con un muro de contraseña sería fricción sin beneficio de seguridad.

Si quieres verificar el bloqueo real, visita el sitio desplegado en <slug>.jamdesk.app (o tu dominio personalizado) desde una ventana de navegador que aún no tenga la cookie.

Solución de problemas

Probablemente la tarjeta del dashboard muestra Password not set. La protección no se activa hasta que hayas (1) subido la configuración a docs.json y (2) establecido una contraseña en Project Settings. Hasta que se complete el segundo paso, cada solicitud devuelve 401 con la pantalla de desbloqueo como cuerpo, lo cual puede parecer que la pantalla "no aparece" si esperabas un destino específico.

Su navegador tiene una cookie jd_auth_<slug> antigua de antes de que rotaras la contraseña. Espera 30 días a que la cookie expire, haz clic en Revoke all sessions en el dashboard, o pídeles que borren las cookies del dominio de documentación. Se les pedirá la contraseña actual en su próxima visita.

No directamente. Jamdesk usa una única contraseña compartida por sitio. Si necesitas acceso por grupo, divide tu documentación en varios proyectos (cada uno con su propia contraseña) o usa el modo de páginas específicas con límites separados de público/privado por audiencia.

Sí a ambos. La cookie de desbloqueo está vinculada al host, así que cada host (el subdominio *.jamdesk.app y tu dominio personalizado) autentica de forma independiente. Los lectores que desbloqueen un host no quedarán preautenticados en el otro.

Las configuraciones de subruta (documentación en yoursite.com/docs detrás de tu propio proxy) funcionan de inmediato: el formulario de desbloqueo se envía bajo el prefijo de ruta /_jd/, que ya reenvía toda configuración de proxy documentada. No se necesitan cambios de proxy al activar o desactivar la protección con contraseña.

Si tu proxy se configuró antes de que el reenvío de /_jd/ formara parte de la guía de configuración, agrega /_jd/* a sus rutas reenviadas.

No. Los sitios protegidos configuran noindex, nofollow en la pantalla de desbloqueo y devuelven 401 para cada página restringida, así que los rastreadores de búsqueda no pueden indexar nada detrás del bloqueo. Las páginas públicas dentro de un sitio protegido siguen siendo indexables normalmente.

¿Qué sigue?

Resumen del control de acceso

Compara la protección con contraseña frente a SSO y el patrón multi-proyecto.

SSO (Enterprise)

Reemplaza las frases de contraseña compartidas con inicio de sesión por usuario a través de tu proveedor de identidad.

Dominios personalizados

Pon tu documentación en tu propio dominio antes de compartir el enlace.

Esquema de auth.password

Referencia completa de campos para enabled, hint, public y private.