Protección con contraseña
Bloquea todo tu sitio de documentación o solo algunas páginas con una contraseña compartida. Los visitantes ven una pantalla de desbloqueo.
A veces quieres documentación que permanezca en Git y en línea, pero que no sea visible para todos. Ejemplos habituales 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 acceso compartida que protege todo tu sitio o un conjunto específico de páginas, sin mover nada fuera de tu repositorio existente.
Las capturas de pantalla muestran la interfaz en inglés.
¿Necesitas autenticación por usuario? Autenticación JWT protege tu documentación con tu propio sistema de inicio de sesión en lugar de una frase de acceso compartida, con sesiones por usuario y acceso a páginas basado en grupos.
Necesitarás un proyecto de 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 se apoya en tu flujo habitual de build y despliegue.
¿Qué modo debo elegir?
Jamdesk tiene dos modos de protección con contraseña. Elige uno según lo que sea público y lo que no.
| Modo sitio completo | Modo páginas específicas | |
|---|---|---|
| Úsalo cuando | Todo es privado: documentación interna de ingeniería, una copia de staging de tu sitio público, un producto sin publicar. | La mayoría de la documentación es pública. Solo necesitas ocultar algunas páginas (un runbook, una función beta, una referencia interna de la API). |
| Cómo activarlo | Define 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úblicas | Sí: marca páginas individuales, grupos de navegación o patrones glob como públicos. | N/A. Cada página es pública a menos que la marques como privada. |
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
Abre tu docs.json y declara la protección de todo el sitio. El campo hint es opcional pero muy recomendable, ya que es la única pista en pantalla que tus lectores obtienen sobre cómo conseguir la contraseña.
{
"$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. Defines la contraseña en el dashboard después del build. Tu repositorio solo contiene el indicador de activación y una pista opcional.
Haz push del cambio a tu rama configurada. Jamdesk ejecuta un build y, durante el build, activa la protección con contraseña en modo sitio completo.
git add docs.json
git commit -m "Turn on password protection"
git pushCuando el build termina, la tarjeta del dashboard cambia de Off a Password not set, y el sitio queda bloqueado. Todas las páginas devuelven 401 y muestran la pantalla de contraseña, y ninguna contraseña funciona hasta que definas una. Las páginas que marcaste como públicas siguen abiertas, y las claves de API del proyecto siguen funcionando para la API de búsqueda, el servidor MCP, las URL .md y los archivos llms. Para volver a hacer público todo el sitio, cambia auth.password.enabled a false y haz push.

Abre Project Settings en el dashboard y desplázate hasta la tarjeta Password Protection. Escribe una frase de acceso fuerte (mínimo 8 caracteres), luego haz clic en Set password.
La tarjeta pasa al estado On. Todos los que tengan la contraseña ya pueden navegar por el sitio; el resto llega a la pantalla de desbloqueo.

Jamdesk nunca almacena tu contraseña en texto plano. Se hashea 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. Haz una rotación en su lugar.
Abre tu sitio de documentación en una ventana de navegación privada (o usa curl) y confirma que obtienes la pantalla de desbloqueo. Prueba una contraseña incorrecta para revisar el estado de error, y luego la real 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 ya estás dentro.
Excepciones públicas
El modo sitio completo tiene una vía de escape: puedes mantener páginas específicas públicas incluso mientras el resto del sitio está protegido. 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 allow-list en cada build.
El frontmatter es la opción más granular. Añade public: true a cualquier archivo .mdx y solo esa página escapa de la protección:
---
title: Get started
public: true
---
Los grupos de navegación cubren toda una sección de una vez. Define public: true en un group o un tab en la navegación de tu docs.json, y todas las páginas debajo se vuelven públicas. Útil para un tab "Marketing" que está junto a documentación interna de ingeniería privada:
{
"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[] gestionan todo lo que el frontmatter y la navegación no pueden: páginas de aterrizaje de nivel superior, rutas generadas dinámicamente, o un subárbol completo que prefieras no reescribir.
{
"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). Una / sola es rechazada en la validación: si Jamdesk la aceptara, un solo error tipográfico podría desbloquear silenciosamente todo tu sitio. Después de cada build, la tarjeta del dashboard muestra la allow-list resuelta, para que puedas verificar qué recogió realmente el build.
Protege solo algunas páginas
El modo páginas específicas sigue el flujo de trabajo opuesto: todo es público por defecto, y tú decides qué páginas proteger individualmente.
Añade private: true al frontmatter de la página. Esta es la opción más sencilla cuando la decisión recae en quien sea propietario 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 protegidas en un solo archivo, añádelas bajo auth.password.private[] en docs.json. Ambos enfoques son acumulativos, así que puedes combinarlos.
{
"auth": {
"password": {
"hint": "Ask the on-call engineer",
"private": ["/admin/runbook", "/internal/api-keys"]
}
}
}Observa que no hay enabled: true. Definir auth.password.private[] sin enabled es lo que activa automáticamente el modo páginas específicas.
Haz push de tus cambios. El siguiente build detecta las páginas privadas, activa la protección en modo páginas específicas, y muestra el aviso del dashboard para definir una contraseña, igual que en el modo sitio completo.
git add content/runbook.mdx docs.json
git commit -m "Gate the incident runbook"
git pushAbre Project Settings, busca la tarjeta Password Protection, y define una frase de acceso. El encabezado de la tarjeta ahora muestra 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.

Navega por tu sitio de documentación con normalidad. 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 introduces la contraseña, quedas conectado durante 30 días en ese dispositivo y puedes leer cualquier página privada sin volver a escribirla.
Lo que ven los visitantes
Cuando alguien accede a una página protegida, obtiene una tarjeta de desbloqueo centrada. Solo muestra el nombre del sitio y una pista opcional, sin barra lateral ni navegación.

La tarjeta está personalizada con el logo de tu sitio y el color principal de 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 vacío, 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 "todavía no se ha introducido ninguna contraseña".

Una vez que el visitante introduce la contraseña correcta, recibe una cookie firmada y puede navegar con normalidad hasta que la sesión expire o la revoques.
Herramientas de IA y claves de API
Las herramientas que no pueden introducir la contraseña, como un cliente MCP o un script que descarga llms.txt, pueden usar una clave de API del proyecto en su lugar. La clave funciona para el servidor MCP, las URL de páginas .md y los archivos llms. Nunca abre las páginas HTML ni el chat de IA.
Rotación y revocación de sesiones
Una contraseña compartida eventualmente necesita cambiar, por ejemplo después de haber circulado o cuando alguien deja el equipo.
Abre la tarjeta Password Protection, escribe una nueva frase de acceso 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 contraseña pueden entrar. La rotación tiene efecto 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 acceso (por ejemplo, si se perdió el portátil de alguien), haz clic en Revoke all sessions en su lugar. Esto incrementa un contador de versión del lado del servidor, lo que invalida todas las cookies emitidas antes del incremento. Los visitantes vuelven a introducir la contraseña actual y recuperan el acceso.
Desactivar la protección
La protección la controla docs.json, así que desactivarla implica editar el archivo y hacer push.
- Sitio completo: elimina
auth.password.enabled(o defínelo comofalse). - Páginas específicas: elimina todos los marcadores
private: truey borraauth.password.private.
En el siguiente build, Jamdesk elimina el hash de contraseña almacenado y devuelve la tarjeta al estado Off. No queda ningún estado "inactivo" persistente. Si vuelves a activar la protección más tarde, tendrás que elegir una contraseña nueva.
Tu repositorio de código fuente no está protegido con contraseña. La protección con contraseña protege 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.enabledestrue, todo el sitio está protegido.private: trueen páginas individuales se vuelve redundante. - Si una página está marcada tanto
public: truecomoprivate: true, gana public. El valor por defecto más seguro es el que evita filtrar una página por accidente. - El
public: truedel frontmatter, elpublic: truede un grupo de navegación, y los globs deauth.password.public[]se combinan en una sola allow-list. No hay una regla de "gana lo más específico". Si alguna señal indica que una página es pública, es pública. - Si
auth.password.private[]está definido peroauth.password.enabledno lo está, Jamdesk activa automáticamente el modo páginas específicas. No necesitas hacer nada más.
Cómo funcionan las sesiones y la limitación de solicitudes
Esta sección cubre la cookie de sesión, los límites de solicitudes, y el almacenamiento de la contraseña.
La cookie de sesión. Tras un desbloqueo exitoso, Jamdesk define una cookie llamada jd_auth_<slug> (por ejemplo, jd_auth_acme). Es HttpOnly, Secure, SameSite=Lax, limitada al host, y firmada con HMAC-SHA256. La carga útil incluye el slug del proyecto, el contador de versión actual, y una marca de tiempo de expiración, de modo que cualquier manipulación falla la validación. La duración por defecto es de 30 días, renovada en cada desbloqueo exitoso.
Limitación de solicitudes. El endpoint de desbloqueo aplica dos contadores por hora: 10 intentos por IP y 100 intentos por proyecto. Ambos se verifican antes de comprobar el hash scrypt, para que un intento de fuerza bruta no pueda consumir CPU ni filtrar información de tiempos. Alcanzar cualquiera de los dos límites devuelve 429 Too Many Requests con un encabezado Retry-After.
Almacenamiento. Tu contraseña se hashea con scrypt y se almacena en el Firestore del dashboard. Nunca llega a tu repositorio, a tu docs.json, ni a ningún artefacto de build. Si la pierdes, haz una rotación. No existe ninguna vía de recuperación.
Pruebas durante el desarrollo local
jamdesk dev ejecuta tu documentación contra el contenido de R2 en vivo 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 protegidas sin conocer la contraseña. Esto es intencional: tú eres el autor, ya tienes las claves 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 la protección real, accede al sitio desplegado en <slug>.jamdesk.app (o tu dominio personalizado) desde una ventana del navegador que aún no tenga la cookie.
Solución de problemas
La tarjeta del dashboard probablemente muestra Password not set. La protección no se activa hasta que hayas (1) enviado la configuración a docs.json y (2) definido una contraseña en Project Settings. Hasta que se complete el segundo paso, cada solicitud devuelve 401 con la pantalla de desbloqueo como contenido, lo que puede parecer que la pantalla "no aparece" si esperabas un destino específico.
Su navegador tiene una cookie antigua jd_auth_<slug> de antes de tu rotación. O esperas 30 días a que la cookie expire, o haces clic en Revoke all sessions en el dashboard, o le pides que borre las cookies del dominio de la documentación. Se le pedirá la contraseña actual en su próxima visita.
No directamente. Jamdesk usa una sola 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 páginas específicas con límites de público/privado independientes 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) se 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 sin configuración adicional: el formulario de desbloqueo se envía bajo el prefijo de ruta /_jd/, que toda configuración de proxy documentada ya reenvía. No se necesitan cambios en el 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, añade /_jd/* a sus rutas reenviadas.
No. Los sitios protegidos definen noindex, nofollow en la pantalla de desbloqueo y devuelven 401 para cada página protegida, así que los rastreadores de búsqueda no pueden indexar nada detrás de la protección. Las páginas públicas dentro de un sitio protegido siguen siendo indexables con normalidad.
