mirror of
https://github.com/mintlify/docs.git
synced 2026-09-14 13:35:46 +08:00
9a4ec7b557
* Fix editor docs accuracy, split media page, clear translation orphans
Accuracy fixes, each verified against mintlify/mint or mintlify/server:
- pages.mdx: "Editors and managers can restore them" -> "admins".
"Manager" is not a Mintlify role.
- index.mdx: publishing on a feature branch does not automatically open a
pull request; you choose commit-to-branch or PR. Contradicted the
branching page's own table.
- branching-and-publishing.mdx: preview deployments build when you open a
pull request, not on every branch save. Confirmed in gitlabWebhooks
(handleMergeRequestOpenEvent) and cruxWebhooks (keyed on reviewId).
tutorial.mdx was already correct.
- settings.mdx: rewritten against editor-settings-form.tsx. The panel has
four sections, not "two layers", and the entire Appearance section was
undocumented - including "Open live preview in new tab", which
live-preview.mdx already linked readers to. Corrected three setting
labels, noted that draft PRs default to on, added the 20,000-character
instruction limit.
- live-preview.mdx: link now resolves to /editor/settings#appearance.
De-bloat:
- Split the media section out of pages.mdx (172 lines, 15 subtopics) into
editor/media.mdx and added it to the nav.
- Trimmed index.mdx from 11 sidebar-duplicating cards to 4.
Translation orphans and redirects:
- Deleted 7 translated files whose English source was removed in April and
June. The translate automation never cleaned them up, and in PR #6062 it
wrote into es|fr|zh/editor/media.mdx 34 days after the English source was
deleted.
- Dropped /editor/media -> /editor/pages so it stops shadowing the
recreated page.
- Added /{es,fr,zh}/editor/publish, completing an English-only redirect.
- Added /editor/collaborate and its language variants. That page was
deleted in June with no redirect and has been a live 404 since.
mint broken-links clean, mint a11y clean, vale 0/0/0 on changed files.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Restructure editor docs: 14 pages to 9, cut UI description
The editor section had grown to 14 pages, about 40% of which described
things a user can see on screen. The ratio was 105 field-enumeration
bullets to 42 procedural steps.
New structure, organized around what is invisible rather than what is
on screen:
Overview absorbs git-essentials (concepts + the Git mapping table)
Tutorial unchanged
Edit content absorbs media and navigation
Publish branch mechanics, conflicts, git sync, commit signing
Review previews, pull requests, approve and merge
Collaborate comments + suggestions + real-time editing
Editor agent trimmed
Settings absorbs configurations as a pointer
Keyboard shortcuts unchanged
Removed: git-essentials, media, navigation, live-preview, comments,
suggestions, configurations, branching-and-publishing. Added: publish,
review, collaborate.
configurations.mdx was the clearest cut. It was a 193-line field-by-field
mirror of the Site configurations panel, which is a third rendering of
information already in the docs.json schema and in organize/settings-*
(2,694 lines). It is now a short section in settings.mdx covering only
what is specific to editing configuration from the editor: real-time
sync, the SVG logo constraint, and the redirects interface.
Also cut: block actions, the minimap, code block options, right-click
menu enumerations, page settings field lists (already delegated to
/organize/pages), and most screenshots of self-evident controls.
1,320 to 848 body lines. Field-enumeration bullets 105 to 29.
English redirects added for all eight removed pages. Language variants
deliberately omitted: es/fr/zh still carry the old structure, so
redirecting those paths now would shadow pages that still exist there.
The translation automation should mirror this restructure; verify
afterward that no orphans remain.
Vale vocabulary widened rather than reworded around: autocommit(s|ed|ing)?,
autosav(e|es|ed|ing), dotfile(s)?.
mint broken-links clean, mint a11y clean, vale 0 errors on editor/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Correct keyboard shortcuts against the editor keymap
Verified every documented shortcut against the bindings in mintlify/mint
rather than inferring them. The app-level set is exhaustive:
mod+backslash, mod+i, mod+k, mod+s, mod+shift+period, mod+z, shift+mod+d,
shift+mod+s. Visual-mode bindings come from the Tiptap extensions.
- Cmd/Ctrl+Shift+F ("Switch between Navigation and Files tree") does not
exist. No such binding is registered anywhere in the dashboard. Replaced
with the real binding at that spot in the UI: Cmd/Ctrl+Shift+. toggles
"Show all files".
- Added Heading 5 and Heading 6. Heading.configure sets levels 1-6 and
preserves the parent Mod-Alt-N shortcuts; the table stopped at 4.
- Added Cmd/Ctrl+G for accordion group, bound in Accordions.tsx.
Confirmed correct and unchanged: Cmd+K search, Cmd+I agent, Cmd+Shift+S
mode toggle, Cmd+Shift+D diff, Cmd+\ sidebar, Cmd+Shift+M comment,
Cmd+Shift+E suggesting mode, Cmd+Shift+X strikethrough, Cmd+K link,
Cmd+Enter line break, Cmd+Shift+8 unordered list, and that source mode
runs Monaco.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Document auto publish, drop the deprecated deploy branch lock
Auto publish is available to all deployments, so the settings panel shows
"Auto publish" rather than "Main branch autocommits". It is not just a
rename: when it is on, the editor hides the branch selector and the
Publish button entirely (TopBar returns null for both), so there is no
pending state and no review step. Documented that behavior in
settings.mdx and added a note at the top of publish.mdx, since that page
otherwise assumes a publish step exists.
The deployment branch lock was deprecated and removed, so it stays out of
the docs. It was already dropped from settings.mdx in the restructure.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* 💅
* copy edit index
* Fix editor docs I verified against dead code
Three claims traced to code that never mounts. Ethan confirmed the diff
shortcut does not work, which exposed the pattern.
- Removed Cmd/Ctrl+Shift+D for diff view. It is registered only at
SubBar/index.tsx:488, inside EditorSubBar, which is exported and
imported by nothing. There is no live diff shortcut; exitDiff exists
only as an onClick in EditorModeContextMenu.
- Source mode runs CodeMirror, not Monaco. SourceEditor resolves through
source-editor/index.tsx to editor-view.tsx, which imports
@codemirror/state and @codemirror/view. Monaco is used only by
EmbedModal. The shortcut rows themselves were correct: CodeMirror's
defaultKeymap and searchKeymap match VS Code for toggle comment, move
line, duplicate line, find, and add cursor above/below, all confirmed
against @codemirror/commands.
- Rewrote the left panel section of pages.mdx. The tabs are Home and
Publishing (EditorNavigationSidebarContents.tsx:62), not Navigation and
Files. The Navigation/Files switcher lives in the same dead SubBar
component. Home renders the workspace file tree including private
pages; Publishing renders the site navigation and site settings.
Confirmed by the e2e helper openPublishingNavigation, which queries the
Publishing tab by role against the running app.
Also corrected in that section: the tree hides docs.json, dotfiles,
extensionless files, all-caps Markdown, and css/js/jsx/mjs/cjs/pdf unless
Show all files is on; "unlisted" was an invented term, replaced with a
link to /organize/hidden-pages; and the folder menu item is "New page",
confirmed by e2e, not "New file".
Added four source-mode bindings that are real and undocumented: Cmd+B and
Cmd+I insert Markdown markers, Cmd+Option+Shift+[ and ] fold and unfold
all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* copy edit pages
* copy edit publish
* copy edit review
* copy edit settings
* copy edit collaborate
* Updated mintlify pages
- Updated quickstart.mdx
Mintlify-Source: dashboard-editor
* copy edit keyboard shortcuts
* Updated mintlify pages
- Updated quickstart.mdx
Mintlify-Source: dashboard-editor
* Revert "Updated mintlify pages"
This reverts commit 8d1b50cbfc.
* Updated mintlify pages
- Updated quickstart.mdx
Mintlify-Source: dashboard-editor
* fix editor edits
* Mirror the editor restructure into es, fr, and zh
Brings all three translated sites onto the same nine-page structure as
English instead of waiting for the translate automation, which has a
documented history of leaving orphans behind.
Content:
- Deleted 21 orphans: branching-and-publishing, comments, configurations,
git-essentials, live-preview, navigation, and suggestions in each
language. None had an English source after the restructure.
- Added publish, review, and collaborate in each language.
- Rewrote index, pages, settings, agent, and keyboard-shortcuts to match
the current English content, including Home/Publishing tabs, CodeMirror
source mode, Show all files, and the restored Appearance section.
- Kept the existing conventions: es uses usted, fr uses vous, keywords and
product UI labels stay in English, and every heading is wrapped in a
<div id="english-slug"> so cross-language anchors resolve. Verified that
every English anchor exists in all three languages.
Navigation and redirects:
- es.json, fr.json, and zh.json now list the same nine pages as docs.json.
- Removed six locale redirects that would have shadowed the new publish
and collaborate pages once they existed.
- Added 21 locale redirects for the removed pages and retargeted the
destinations that pointed at them.
- Retargeted four /editor/configurations redirects that pointed at
#site-configurations, an anchor dropped in the settings rewrite.
- Rewrote stale links in changelog, authentication-setup, concepts, and
glossary across all three languages, since broken-links does not follow
redirects.
English fixes needed first, all caused by the settings restructure:
- Restored ## Appearance. Two pages link to #appearance, and its four
preferences were otherwise undocumented.
- Restored ## Create draft pull requests by default, which changelog
links to and which defaults to on.
- Promoted Main branch autocommits from ### to ##; it was nested under PR
instructions, and its warning named a setting no longer on the page.
- Retargeted publish.mdx from the removed #auto-publish anchor.
- Fixed a missing space in the settings page intro.
mint broken-links clean, mint a11y clean (1042 files), vale 0 errors,
all five JSON files valid.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
585 lines
31 KiB
Plaintext
585 lines
31 KiB
Plaintext
---
|
|
title: "Configuración de autenticación"
|
|
description: "Configura la autenticación de usuarios para controlar el acceso a páginas y referencias de API con contraseña, OAuth, JWT o acceso privado en Mintlify."
|
|
keywords: ['authentication', 'auth', 'OAuth', 'JWT', 'password', 'private']
|
|
---
|
|
|
|
<Info>
|
|
La autenticación privada para tu organización de Mintlify está disponible en todos los planes.
|
|
|
|
La autenticación por contraseña requiere un [plan Pro o Enterprise](https://mintlify.com/pricing?ref=authentication).
|
|
|
|
La autenticación con OAuth y JWT requiere un [plan Enterprise](https://mintlify.com/pricing?ref=authentication).
|
|
</Info>
|
|
|
|
La autenticación exige que los usuarios inicien sesión antes de acceder a tu contenido.
|
|
|
|
Puedes configurar autenticación completa para todas las páginas o autenticación parcial en la que algunas páginas son públicas y otras requieren autenticación.
|
|
|
|
La autenticación solo está disponible para sitios alojados en un dominio personalizado o subdominio de Mintlify. Por ejemplo, `docs.ejemplo.com` o `ejemplo.mintlify.site`. La autenticación **no es compatible** para sitios con una [subruta personalizada](/es/deploy/docs-subpath). Por ejemplo, `ejemplo.com/docs`.
|
|
|
|
Para identificar a los visitantes sin dejar de mantener las páginas públicas, usa la [personalización](/es/create/personalization). La personalización admite subrutas personalizadas y puede rellenar previamente los campos del área de pruebas de la API sin exigir a los visitantes que se autentiquen antes de ver una página.
|
|
|
|
<div id="choose-an-authentication-method">
|
|
## Elige un método de autenticación
|
|
</div>
|
|
|
|
Usa esta comparación para elegir el método que se adapte a tu caso de uso. Consulta [Disponibilidad de funciones](#feature-availability) para ver cómo interactúa cada método con otras funciones de Mintlify.
|
|
|
|
| Método | Ideal para | Plan | Control de acceso basado en grupos | Autocompletado del área de pruebas de la API | Personalización |
|
|
| :--- | :--- | :--- | :---: | :---: | :---: |
|
|
| Contraseña | Acceso compartido sencillo sin seguimiento por usuario | Pro o Enterprise | — | — | — |
|
|
| Autenticación privada | Documentación interna para miembros de tu organización de Mintlify | Todos los planes | — | — | — |
|
|
| OAuth 2.0 | Proveedor de identidad existente o SSO con sesiones por usuario | Enterprise | ✓ | ✓ | ✓ |
|
|
| JWT | Backend de autenticación personalizado o documentación integrada detrás de tu propio inicio de sesión | Enterprise | ✓ | ✓ | ✓ |
|
|
|
|
<div id="configure-authentication">
|
|
## Configurar la autenticación
|
|
</div>
|
|
|
|
<Tabs>
|
|
<Tab title="Contraseña">
|
|
<Info>
|
|
La autenticación mediante contraseña proporciona únicamente control de acceso y **no** admite funciones específicas por usuario, como el control de acceso basado en grupos o el autocompletado previo del área de pruebas de la API.
|
|
</Info>
|
|
|
|
<div id="password-prerequisites">
|
|
### Requisitos previos de la contraseña
|
|
</div>
|
|
|
|
* Tus requisitos de seguridad permiten compartir contraseñas entre usuarios.
|
|
|
|
<div id="password-setup">
|
|
### Configuración de la contraseña
|
|
</div>
|
|
|
|
<Steps>
|
|
<Step title="Crea una contraseña.">
|
|
1. En tu dashboard, ve a [Authentication](https://dashboard.mintlify.com/products/authentication).
|
|
2. En la sección **Authentication method**, establece la visibilidad del sitio en **Private**.
|
|
3. Haz clic en **Password**.
|
|
4. Introduce una contraseña segura.
|
|
5. Haz clic en **Save changes**.
|
|
|
|
Después de guardar, tu sitio se vuelve a implementar automáticamente. Cuando la implementación haya finalizado, cualquiera que visite tu sitio deberá introducir la contraseña para acceder a tu contenido.
|
|
</Step>
|
|
|
|
<Step title="Distribuye el acceso.">
|
|
Comparte de forma segura la contraseña y la URL de la documentación con los usuarios autorizados.
|
|
</Step>
|
|
</Steps>
|
|
|
|
<div id="password-example">
|
|
### Ejemplo de contraseña
|
|
</div>
|
|
|
|
Alojas tu documentación en `docs.foo.com` y necesitas un control de acceso básico sin hacer seguimiento de usuarios individuales. Quieres evitar el acceso público sin complicar la configuración.
|
|
|
|
**Crea una contraseña segura** en tu dashboard. **Comparte las credenciales** con los usuarios autorizados.
|
|
</Tab>
|
|
|
|
<Tab title="Autenticación privada">
|
|
<div id="private-authentication-prerequisites">
|
|
### Requisitos previos de la autenticación privada
|
|
</div>
|
|
|
|
* Todas las personas que necesiten acceder a tu sitio deben ser miembros de tu organización de Mintlify.
|
|
|
|
<div id="private-authentication-setup">
|
|
### Configuración de la autenticación privada
|
|
</div>
|
|
|
|
<Steps>
|
|
<Step title="Habilita la autenticación privada.">
|
|
1. En tu dashboard, ve a [Authentication](https://dashboard.mintlify.com/products/authentication).
|
|
2. En la sección **Authentication method**, establece la visibilidad del sitio en **Private**.
|
|
3. Haz clic en **Authenticated**.
|
|
4. Haz clic en **Save changes**.
|
|
|
|
Después de guardar, tu sitio se vuelve a implementar automáticamente. Una vez que finalice la implementación, cualquier persona que visite tu sitio deberá iniciar sesión en tu organización de Mintlify para acceder a tu contenido.
|
|
</Step>
|
|
|
|
<Step title="Agrega usuarios autorizados.">
|
|
1. En tu dashboard, ve a [Members](https://dashboard.mintlify.com/settings/organization/members).
|
|
2. Agrega a cada persona que deba tener acceso a tu documentación.
|
|
3. Asigna los roles apropiados según sus permisos de edición.
|
|
</Step>
|
|
</Steps>
|
|
|
|
<div id="private-example">
|
|
### Ejemplo de autenticación privada
|
|
</div>
|
|
|
|
Alojas tu documentación en `docs.foo.com` y todo tu equipo tiene acceso a tu dashboard. Quieres restringir el acceso solo a los miembros del equipo.
|
|
|
|
**Habilita la autenticación privada** en la configuración de tu dashboard.
|
|
|
|
**Verifica el acceso del equipo** comprobando que todos los miembros del equipo estén activos en tu organización.
|
|
</Tab>
|
|
|
|
<Tab title="OAuth 2.0">
|
|
<div id="oauth-20-prerequisites">
|
|
### Requisitos previos de OAuth 2.0
|
|
</div>
|
|
|
|
* Un servidor OAuth u OIDC que admita el flujo de código de autorización (Authorization Code Flow).
|
|
* Capacidad para crear un endpoint de API accesible mediante tokens de acceso OAuth (opcional, para habilitar el control de acceso basado en grupos).
|
|
|
|
<div id="oauth-20-setup">
|
|
### Configuración de OAuth 2.0
|
|
</div>
|
|
|
|
<Steps>
|
|
<Step title="Configura tus ajustes de OAuth.">
|
|
1. En tu dashboard, ve a [Authentication](https://dashboard.mintlify.com/products/authentication).
|
|
2. En la sección **Authentication method**, establece la visibilidad del sitio en **Private**.
|
|
3. Haz clic en **Custom**
|
|
4. Haz clic en **OAuth**.
|
|
5. Configura estos campos:
|
|
|
|
* **Authorization URL**: Tu endpoint de OAuth.
|
|
* **Client ID**: Tu identificador de cliente de OAuth 2.0.
|
|
* **Client Secret**: Tu secreto de cliente de OAuth 2.0.
|
|
* **Scopes** (opcional): Permisos que se van a solicitar. Copia la cadena de scope **completa** (por ejemplo, para un scope como `provider.users.docs`, copia el `provider.users.docs` completo). Usa varios scopes si necesitas diferentes niveles de acceso.
|
|
* **Additional authorization parameters** (opcional): Parámetros de consulta adicionales que se agregarán a la solicitud de autorización inicial.
|
|
* **Token URL**: Tu endpoint de intercambio de tokens de OAuth.
|
|
* **Info API URL** (opcional): Endpoint en tu servidor al que Mintlify llama para obtener información del usuario. Usa este campo para el enfoque de Info API para el control de acceso basado en grupos. También puedes usar los claims de OAuth. Si no configuras ninguno de los dos, el flujo de OAuth solo verifica la identidad.
|
|
* **Logout URL** (opcional): La URL de cierre de sesión nativa de tu proveedor de OAuth. Cuando los usuarios cierran sesión, Mintlify valida la redirección de cierre de sesión frente a esta URL configurada por motivos de seguridad. La redirección solo se completa si coincide exactamente con el `logoutUrl` configurado. Si no configuras una Logout URL, los usuarios se redirigen a `/login`. Mintlify redirige a los usuarios con una solicitud `GET` y no agrega parámetros de consulta, por lo que debes incluir cualquier parámetro (por ejemplo, `returnTo`) directamente en la URL.
|
|
* **Redirect URL** (opcional): La URL a la que se redirigirá a los usuarios después de la autenticación.
|
|
|
|
5. Haz clic en **Guardar cambios**.
|
|
|
|
Después de configurar tus ajustes de OAuth, tu sitio se vuelve a implementar. Cuando finalice la implementación, cualquier persona que visite tu sitio deberá iniciar sesión en tu proveedor de OAuth para acceder a tu contenido.
|
|
</Step>
|
|
|
|
<Step title="Configura tu servidor OAuth.">
|
|
1. Copia la **Redirect URL** de tus [ajustes de autenticación](https://dashboard.mintlify.com/products/authentication).
|
|
2. Agrega la Redirect URL como una URL de redirección autorizada en tu servidor OAuth.
|
|
</Step>
|
|
|
|
<Step title="Crea tu endpoint de información de usuario para el acceso por grupos (opcional).">
|
|
Para usar el enfoque de Info API para el control de acceso basado en grupos, crea un endpoint de API que:
|
|
|
|
* Responda a solicitudes `GET`.
|
|
* Acepte un encabezado `Authorization: Bearer <access_token>` para la autenticación.
|
|
* Devuelva los datos de usuario en el formato `User`. Consulta [Formato de datos de usuario](#user-data-format) para obtener más información.
|
|
|
|
Mintlify llama a este endpoint con el token de acceso de OAuth para obtener la información del usuario. No se envían parámetros de consulta adicionales.
|
|
|
|
Agrega la URL de este endpoint al campo **Info API URL** en tus [ajustes de autenticación](https://dashboard.mintlify.com/products/authentication).
|
|
</Step>
|
|
</Steps>
|
|
|
|
<div id="use-groups-from-oauth-token-claims">
|
|
### Usa los grupos incluidos en los claims del token de OAuth
|
|
</div>
|
|
|
|
Si tu proveedor de identidad incluye la pertenencia a grupos en el token de ID o en el token de acceso, puedes usar esos claims en lugar de una URL de Info API. Esta opción está disponible para configuraciones de OAuth que usan un secreto de cliente.
|
|
|
|
Al configurar los claims del token de OAuth para tu implementación, usa valores como estos:
|
|
|
|
```json
|
|
{
|
|
"source": "id_token",
|
|
"groupsClaim": "groups",
|
|
"groupsDelimiter": ","
|
|
}
|
|
```
|
|
|
|
* `source`: Selecciona `id_token` o `access_token`. Si seleccionas `id_token`, incluye el scope `openid` en tus scopes de OAuth.
|
|
* `groupsClaim`: Identifica el claim del token que contiene los grupos. El valor predeterminado de `groupsClaim` es `groups`.
|
|
* `groupsDelimiter`: Delimitador opcional de 1 a 4 caracteres. Mintlify solo lo usa para dividir los valores de los claims que sean cadenas.
|
|
|
|
Por ejemplo, con `"groups": "general,clienta_eur"` y `groupsDelimiter` establecido en `","`, Mintlify usa `general` y `clienta_eur` como grupos separados.
|
|
|
|
Mintlify elimina los espacios en blanco alrededor de cada grupo e ignora los segmentos vacíos. Sin `groupsDelimiter`, la cadena completa se trata como un solo grupo. Los claims que son arrays siempre se tratan como un grupo por cada elemento de cadena y no se dividen.
|
|
|
|
Omite `groupsDelimiter` cuando el delimitador pueda formar parte del nombre de un grupo.
|
|
|
|
<div id="oauth-20-example">
|
|
### Ejemplo de OAuth 2.0
|
|
</div>
|
|
|
|
Alojas tu documentación en `docs.foo.com` y tienes un servidor OAuth existente en `auth.foo.com` que admite el flujo de código de autorización (Authorization Code Flow).
|
|
|
|
**Configura los detalles de tu servidor OAuth** en tu dashboard:
|
|
|
|
* **Authorization URL**: `https://auth.foo.com/authorization`
|
|
* **Client ID**: `ydybo4SD8PR73vzWWd6S0ObH`
|
|
* **Scopes**: `['provider.users.docs']`
|
|
* **Token URL**: `https://auth.foo.com/exchange`
|
|
* **Info API URL**: `https://api.foo.com/docs/user-info`
|
|
* **Logout URL**: `https://auth.foo.com/logout?returnTo=https%3A%2F%2Fdocs.foo.com`
|
|
|
|
**Crea un endpoint de información de usuario** en `api.foo.com/docs/user-info`, que requiera un token de acceso OAuth con el scope `provider.users.docs`, y devuelva:
|
|
|
|
```json
|
|
{
|
|
"groups": ["engineering", "admin"],
|
|
"expiresAt": 1893456000,
|
|
"apiPlaygroundInputs": {
|
|
"header": {
|
|
"Authorization": "Bearer user_abc123"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
<Note>
|
|
Controla la duración de la sesión con el campo `expiresAt` en la respuesta de información de usuario. Este es un timestamp Unix (segundos desde el inicio de la época Unix) que indica cuándo debe expirar la sesión. Consulta [Formato de datos de usuario](#user-data-format) para más detalles.
|
|
</Note>
|
|
|
|
**Configura tu servidor OAuth para permitir redirecciones** a tu URL de callback.
|
|
</Tab>
|
|
|
|
<Tab title="JWT">
|
|
<div id="jwt-prerequisites">
|
|
### Requisitos previos de JWT
|
|
</div>
|
|
|
|
* Un sistema de autenticación que pueda generar y firmar JWT.
|
|
* Un servicio de backend que pueda crear URL de redirección.
|
|
|
|
<div id="jwt-setup">
|
|
### Configuración de JWT
|
|
</div>
|
|
|
|
<Steps>
|
|
<Step title="Genera una clave privada.">
|
|
1. En tu dashboard, ve a [Authentication](https://dashboard.mintlify.com/products/authentication).
|
|
2. En la sección **Authentication method**, establece la visibilidad del sitio en **Private**.
|
|
3. Haz clic en **Custom**
|
|
4. Haz clic en **JWT**.
|
|
5. Introduce la URL de tu flujo de inicio de sesión existente.
|
|
6. Para ofrecer más de un flujo de inicio de sesión, haz clic en **Add login URL** e introduce un nombre visible y una URL para cada opción. Puedes configurar hasta 10 URL de inicio de sesión.
|
|
7. Haz clic en **Save changes**.
|
|
8. Haz clic en **Generate new key**.
|
|
9. Almacena tu clave de forma segura donde tu backend pueda acceder a ella.
|
|
|
|
Después de generar una clave privada, tu sitio se vuelve a implementar automáticamente. Cuando la implementación haya finalizado, cualquier persona que visite tu sitio debe iniciar sesión en tu sistema de autenticación JWT para acceder a tu contenido.
|
|
</Step>
|
|
|
|
<Step title="Integra la autenticación de Mintlify en tu flujo de inicio de sesión.">
|
|
Modifica tu flujo de inicio de sesión existente para incluir estos pasos después de la autenticación del usuario:
|
|
|
|
* Crea un JWT que contenga la información del usuario autenticado en el formato `User`. Consulta [Formato de datos de usuario](#user-data-format) para obtener más información.
|
|
* Firma el JWT con tu clave secreta, usando el algoritmo EdDSA.
|
|
* Crea una URL de redirección de vuelta a la ruta `/login/jwt-callback` de tu documentación, incluyendo el JWT como el hash.
|
|
</Step>
|
|
</Steps>
|
|
|
|
Cuando la autenticación con JWT tiene una única URL de inicio de sesión, los visitantes no autenticados se redirigen a ella automáticamente. Con dos o más URL de inicio de sesión con nombre, los visitantes primero ven una página de selección y luego continúan al flujo de inicio de sesión elegido. Mintlify reenvía el parámetro `redirect` validado para que el visitante regrese a la página de documentación que solicitó originalmente.
|
|
|
|
<Note>
|
|
Las múltiples URL de inicio de sesión están disponibles para la autenticación JWT completa y parcial. La [personalización](/es/create/personalization) con JWT admite una única URL de inicio de sesión porque identifica a los visitantes sin exigirles iniciar sesión antes de ver contenido público.
|
|
</Note>
|
|
|
|
<div id="jwt-example">
|
|
### Ejemplo de JWT
|
|
</div>
|
|
|
|
Alojas tu documentación en `docs.foo.com` con un sistema de autenticación existente en `foo.com`. Quieres ampliar tu flujo de inicio de sesión para conceder acceso a la documentación manteniéndola separada de tu dashboard (o no tienes un dashboard).
|
|
|
|
Crea un endpoint de inicio de sesión en `https://foo.com/docs-login` que amplíe tu autenticación existente.
|
|
|
|
Después de verificar las credenciales del usuario:
|
|
|
|
* Genera un JWT con los datos del usuario en el formato de Mintlify.
|
|
* Firma el JWT y redirige a `https://docs.foo.com/login/jwt-callback#{SIGNED_JWT}`.
|
|
|
|
<CodeGroup>
|
|
```ts TypeScript
|
|
import * as jose from 'jose';
|
|
import { Request, Response } from 'express';
|
|
|
|
const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2;
|
|
const DOCS_HOST = 'docs.example.com';
|
|
|
|
const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'EdDSA');
|
|
|
|
export async function handleRequest(req: Request, res: Response) {
|
|
const user = {
|
|
host: DOCS_HOST, // Debe coincidir con la URL de tu documentación
|
|
expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000), // vencimiento de la sesión de 2 semanas
|
|
groups: res.locals.user.groups,
|
|
apiPlaygroundInputs: {
|
|
header: {
|
|
"Authorization": `Bearer ${res.locals.user.apiKey}`,
|
|
},
|
|
},
|
|
};
|
|
|
|
const jwt = await new jose.SignJWT(user)
|
|
.setProtectedHeader({ alg: 'EdDSA' })
|
|
.setExpirationTime('10 s') // vencimiento del JWT de 10 segundos
|
|
.sign(signingKey);
|
|
|
|
return res.redirect(`https://${DOCS_HOST}/login/jwt-callback#${jwt}`);
|
|
}
|
|
```
|
|
|
|
```python Python
|
|
import jwt # pyjwt
|
|
import os
|
|
|
|
from datetime import datetime, timedelta
|
|
from fastapi.responses import RedirectResponse
|
|
|
|
private_key = os.getenv(MINTLIFY_JWT_PEM_SECRET_NAME, '')
|
|
DOCS_HOST = 'docs.example.com'
|
|
|
|
@router.get('/auth')
|
|
async def return_mintlify_auth_status(current_user):
|
|
jwt_token = jwt.encode(
|
|
payload={
|
|
'host': DOCS_HOST, # Debe coincidir con la URL de tu documentación
|
|
'exp': int((datetime.now() + timedelta(seconds=10)).timestamp()), # vencimiento del JWT de 10 segundos
|
|
'expiresAt': int((datetime.now() + timedelta(weeks=2)).timestamp()), # vencimiento de la sesión de 2 semanas
|
|
'groups': ['admin'] if current_user.is_admin else [],
|
|
'apiPlaygroundInputs': {
|
|
'header': {
|
|
'Authorization': f'Bearer {current_user.api_key}',
|
|
},
|
|
},
|
|
},
|
|
key=private_key,
|
|
algorithm='EdDSA'
|
|
)
|
|
|
|
return RedirectResponse(url=f'https://{DOCS_HOST}/login/jwt-callback#{jwt_token}', status_code=302)
|
|
```
|
|
</CodeGroup>
|
|
|
|
<div id="redirect-unauthenticated-users">
|
|
### Redirigir a usuarios no autenticados
|
|
</div>
|
|
|
|
Cuando un usuario no autenticado intenta acceder a una página protegida, la redirección a tu URL de inicio de sesión conserva el destino previsto del usuario.
|
|
|
|
1. El usuario intenta visitar una página protegida: `https://docs.foo.com/quickstart`.
|
|
2. Redirige a tu URL de inicio de sesión con un parámetro de consulta llamado `redirect`: `https://foo.com/docs-login?redirect=%2Fquickstart`.
|
|
3. Después de la autenticación, redirige a `https://docs.foo.com/login/jwt-callback?redirect=%2Fquickstart#{SIGNED_JWT}`.
|
|
4. El usuario llega a su destino original.
|
|
</Tab>
|
|
</Tabs>
|
|
|
|
<div id="make-pages-public">
|
|
## Hacer públicas las páginas
|
|
</div>
|
|
|
|
Cuando uses Autenticación, todas las páginas están protegidas de forma predeterminada. Puedes hacer que páginas específicas sean visibles sin autenticación a nivel de página o de grupo con la propiedad `public`.
|
|
|
|
<div id="individual-pages">
|
|
### Páginas individuales
|
|
</div>
|
|
|
|
Para hacer pública una página, agrega `public: true` al frontmatter de la página.
|
|
|
|
```mdx Public page example
|
|
---
|
|
title: "Página pública"
|
|
public: true
|
|
---
|
|
```
|
|
|
|
<div id="groups-of-pages">
|
|
### Grupos de páginas
|
|
</div>
|
|
|
|
Para hacer públicas todas las páginas de un grupo, añade `"public": true` debajo del nombre del grupo en el objeto `navigation` de tu `docs.json`.
|
|
|
|
```json Public group example
|
|
{
|
|
"navigation": {
|
|
"groups": [
|
|
{
|
|
"group": "Grupo público",
|
|
"public": true,
|
|
"icon": "play",
|
|
"pages": [
|
|
"quickstart",
|
|
"installation",
|
|
"settings"
|
|
]
|
|
},
|
|
{
|
|
"group": "Grupo privado",
|
|
"icon": "pause",
|
|
"pages": [
|
|
"private-information",
|
|
"secret-settings"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
<div id="control-access-with-groups">
|
|
## Controla el acceso con groups
|
|
</div>
|
|
|
|
Cuando usas OAuth o autenticación con JWT (JSON Web Token), puedes restringir páginas específicas a ciertos grupos de usuarios. Esto es útil cuando quieres que distintos usuarios vean contenido diferente según su rol o atributos.
|
|
|
|
Administra los grupos mediante los datos del usuario enviados durante la autenticación. Consulta [Formato de datos de usuario](#user-data-format) para más detalles.
|
|
|
|
```json Example user info
|
|
{
|
|
"groups": ["admin", "beta-users"],
|
|
"expiresAt": 1893456000
|
|
}
|
|
```
|
|
|
|
Especifica qué groups pueden acceder a páginas determinadas usando la propiedad `groups` en el frontmatter.
|
|
|
|
```mdx Example page restricted to the admin group highlight={3}
|
|
---
|
|
title: "Panel de administración"
|
|
groups: ["admin"]
|
|
---
|
|
```
|
|
|
|
Los usuarios deben pertenecer al menos a uno de los groups enumerados para acceder a la página. Si un usuario intenta acceder a una página sin el group requerido, recibirá un error 404.
|
|
|
|
<div id="how-groups-interact-with-public-pages">
|
|
### Cómo interactúan los groups con las páginas públicas
|
|
</div>
|
|
|
|
* Todas las páginas requieren Autenticación de forma predeterminada.
|
|
* Las páginas con una propiedad `groups` solo son accesibles para usuarios autenticados dentro de esos groups.
|
|
* Las páginas sin la propiedad `groups` son accesibles para todos los usuarios autenticados.
|
|
* Las páginas con `public: true` y sin la propiedad `groups` son accesibles para cualquier persona.
|
|
|
|
<CodeGroup>
|
|
```mdx Public page
|
|
---
|
|
title: "Guía pública"
|
|
public: true
|
|
---
|
|
```
|
|
|
|
```mdx Protected page
|
|
---
|
|
title: "Referencia de API"
|
|
---
|
|
```
|
|
|
|
```mdx Protected page with groups
|
|
---
|
|
title: "Configuraciones avanzadas"
|
|
groups: ["pro", "enterprise"]
|
|
---
|
|
```
|
|
</CodeGroup>
|
|
|
|
<div id="user-data-format">
|
|
## Formato de datos de usuario
|
|
</div>
|
|
|
|
Cuando utilices autenticación OAuth o JWT o personalización independiente, tu sistema devolverá datos de usuario que controlan la duración de la sesión, la pertenencia a grupos y la [personalización de contenido](/es/create/personalization).
|
|
|
|
<CodeGroup>
|
|
```tsx Format
|
|
type User = {
|
|
host?: string;
|
|
expiresAt?: number;
|
|
groups?: string[];
|
|
content?: Record<string, any>;
|
|
apiPlaygroundInputs?: {
|
|
server?: Record<string, string>;
|
|
header?: Record<string, unknown>;
|
|
query?: Record<string, unknown>;
|
|
cookie?: Record<string, unknown>;
|
|
path?: Record<string, unknown>;
|
|
};
|
|
};
|
|
```
|
|
|
|
```json Ejemplo
|
|
{
|
|
"host": "docs.example.com",
|
|
"expiresAt": 1893456000,
|
|
"groups": ["admin", "beta-users"],
|
|
"content": {
|
|
"firstName": "Jane",
|
|
"company": "Acme Corp"
|
|
},
|
|
"apiPlaygroundInputs": {
|
|
"header": {
|
|
"Authorization": "Bearer user_abc123"
|
|
},
|
|
"server": {
|
|
"baseUrl": "https://api.foo.com"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
</CodeGroup>
|
|
|
|
<ParamField path="host" type="string">
|
|
**Obligatorio para la autenticación JWT.** El nombre de host de tu sitio de documentación. La cadena debe coincidir exactamente con el dominio donde implementas tu documentación. Mintlify valida que el host del JWT coincida con el host de la solicitud para evitar la reutilización de tokens entre diferentes sitios.
|
|
</ParamField>
|
|
|
|
<ParamField path="expiresAt" type="number">
|
|
Momento de expiración de la sesión en segundos desde el epoch. Cuando la hora actual supera este valor, Mintlify expira los datos de usuario almacenados. El visitante debe autenticarse de nuevo o repetir el flujo de identificación para actualizarlos.
|
|
|
|
<Warning>**Para JWT:** Esto es diferente del claim `exp` del JWT, que determina cuándo un JWT se considera inválido. Configura el claim `exp` del JWT con una duración corta (10 segundos o menos) por seguridad. Usa `expiresAt` para la duración real de la sesión (de horas a semanas).</Warning>
|
|
</ParamField>
|
|
|
|
<ParamField path="groups" type="string[]">
|
|
Lista de los grupos a los que pertenece el usuario. Con autenticación, las páginas cuyo frontmatter tenga un `groups` coincidente son accesibles para este usuario. Con la personalización independiente, `groups` controla la visibilidad de páginas y contenido, pero no restringe el acceso a la URL directa de una página.
|
|
|
|
**Ejemplo**: Un usuario con `groups: ["admin", "engineering"]` coincide con el contenido etiquetado con los grupos `admin` o `engineering`.
|
|
</ParamField>
|
|
|
|
<ParamField path="content" type="Record<string, any>">
|
|
Datos personalizados accesibles en páginas MDX mediante la variable `user` para [contenido personalizado](/es/create/personalization#dynamic-mdx-content).
|
|
</ParamField>
|
|
|
|
<ParamField path="apiPlaygroundInputs" type="object">
|
|
Rellena previamente los campos del área de pruebas de la API con valores específicos del usuario. Cuando un usuario se autentica, estos valores rellenan los campos de entrada correspondientes en el área de pruebas de la API. Los usuarios pueden sobrescribir los valores rellenados previamente, y sus cambios persisten en el almacenamiento local.
|
|
|
|
Mintlify aplica únicamente los valores que coinciden con el esquema de seguridad del endpoint actual.
|
|
|
|
<Expandable title="propiedades">
|
|
<ParamField path="header" type="Record<string, unknown>">
|
|
Valores de encabezado que se van a rellenar previamente, indexados por nombre de encabezado.
|
|
</ParamField>
|
|
|
|
<ParamField path="query" type="Record<string, unknown>">
|
|
Valores de parámetros de búsqueda que se van a rellenar previamente, indexados por nombre de parámetro.
|
|
</ParamField>
|
|
|
|
<ParamField path="cookie" type="Record<string, unknown>">
|
|
Valores de cookies que se van a rellenar previamente, indexados por nombre de cookie.
|
|
</ParamField>
|
|
|
|
<ParamField path="server" type="Record<string, string>">
|
|
Valores de variables de servidor que se van a rellenar previamente, indexados por nombre de variable.
|
|
</ParamField>
|
|
|
|
<ParamField path="path" type="Record<string, unknown>">
|
|
Valores de parámetros de ruta que se van a rellenar previamente, indexados por nombre de parámetro.
|
|
</ParamField>
|
|
</Expandable>
|
|
</ParamField>
|
|
|
|
<div id="feature-availability">
|
|
## Disponibilidad de funciones
|
|
</div>
|
|
|
|
Algunas funciones se comportan de manera diferente o no están disponibles cuando habilitas la autenticación. Mintlify no admite el alojamiento público de archivos arbitrarios en un sitio autenticado. Todos los archivos alojados, incluidos `llms.txt`, `llms-full.txt` y `skill.md`, están sujetos a los mismos requisitos de autenticación que las páginas de tu documentación.
|
|
|
|
| Función | Público | Totalmente autenticado (todas las páginas protegidas) | Parcialmente autenticado (algunas páginas públicas) |
|
|
| :----------------------------------------------------------- | :---------------------- | :--------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------- |
|
|
| [llms.txt and llms-full.txt](/es/ai/llmstxt) | Compatibilidad completa | Disponible tras autenticación, por lo que es posible que las herramientas de IA no puedan acceder a los archivos | Disponible tras autenticación, por lo que es posible que las herramientas de IA no puedan acceder a los archivos |
|
|
| [Servidor MCP](/es/ai/model-context-protocol) | Compatibilidad completa | Requiere autenticación para conectarse | Disponible sin autenticación para páginas públicas y con autenticación para páginas protegidas |
|
|
| [Exportación a Markdown](/es/ai/markdown-export) | Compatibilidad completa | Compatibilidad completa, respeta los grupos de usuarios | Compatibilidad completa, respeta los grupos de usuarios |
|
|
| [Exportación a PDF](/es/optimize/pdf-exports) | Compatibilidad completa | Compatibilidad completa, respeta los grupos de usuarios. Las páginas autenticadas se exportan con imágenes y recursos incluidos. | Compatibilidad completa, respeta los grupos de usuarios. Las páginas autenticadas se exportan con imágenes y recursos incluidos. |
|
|
| [Búsqueda](/es/assistant/index) | Compatibilidad completa | Compatibilidad completa, respeta los grupos de usuarios | Compatibilidad completa, respeta los grupos de usuarios |
|
|
| [Assistant](/es/assistant/index) | Compatibilidad completa | Compatibilidad completa, respeta los grupos de usuarios | Compatibilidad completa, respeta los grupos de usuarios |
|
|
| [skill.md](/es/ai/skillmd) | Compatibilidad completa | No compatible | No compatible |
|
|
| [Mapa del sitio](/es/optimize/seo#sitemaps-and-robotstxt-files) | Compatibilidad completa | Disponible tras autenticación, pero excluye las páginas en groups | Disponible tras autenticación, pero excluye las páginas en groups |
|
|
| [robots.txt](/es/optimize/seo#sitemaps-and-robotstxt-files) | Compatibilidad completa | Disponible tras autenticación | Disponible tras autenticación |
|
|
| [Vista previa en vivo](/es/editor/review#live-preview) | Compatibilidad completa | Compatible con autenticación automática del editor | Compatible con autenticación automática del editor |
|