La personnalisation adapte votre documentation à chaque utilisateur lorsqu’il est connecté. Par exemple, vous pouvez préremplir ses clés API, afficher du contenu spécifique à son plan ou à son rôle, ou masquer les sections auxquelles il n’a pas besoin d’accéder.

Fonctionnalités de personnalisation

Personnalisez votre contenu grâce à ces fonctionnalités de personnalisation.

Préremplissage de la clé API

Renseignez automatiquement les champs du Bac à sable API avec des valeurs propres à chaque utilisateur en renvoyant des noms de champs identiques dans vos données utilisateur. Pour que le préremplissage automatique fonctionne, les noms de champs de vos données utilisateur doivent correspondre exactement à ceux du Bac à sable API.

Contenu MDX dynamique

Affichez du contenu dynamique en fonction d’informations sur l’utilisateur, comme son prénom, son abonnement ou son organisation, en utilisant la variable user.
Welcome back, {user.firstName}! Your {user.org?.plan} plan includes...
Consultez la section Format des données utilisateur ci-dessous pour des exemples détaillés et des recommandations de mise en œuvre.

Visibilité des pages

Limitez les pages visibles pour vos utilisateurs en ajoutant des champs groups au frontmatter de vos pages. Par défaut, chaque page est visible par tous les utilisateurs. Les utilisateurs ne verront que les pages dont les groups correspondent à ceux auxquels ils appartiennent.
---
title: "Managing your users"
description: "Adding and removing users from your organization"
groups: ["admin"]
---

Format des données utilisateur

Lors de la mise en œuvre de la personnalisation, votre système renvoie des données utilisateur dans un format spécifique qui permet d’adapter le contenu. Ces données peuvent être envoyées soit sous forme d’objet JSON brut, soit dans un JWT signé, selon votre méthode de handshake. La structure des données est identique dans les deux cas.
type User = {
  expiresAt?: number;
  groups?: string[];
  content?: Record<string, any>;
  apiPlaygroundInputs?: {
    header?: Record<string, any>;
    query?: Record<string, any>;
    cookie?: Record<string, any>;
    server?: Record<string, string>;
  };
};
expiresAt
number
Heure d’expiration de session en secondes depuis l’epoch. Si l’utilisateur charge une page après cette heure, ses données stockées sont automatiquement supprimées et il doit se réauthentifier.
Pour les handshakes JWT : Ceci diffère de la revendication exp du JWT, qui détermine quand un JWT est considéré invalide. Définissez la revendication exp du JWT sur une courte durée (10 secondes ou moins) pour des raisons de sécurité. Utilisez expiresAt pour la durée réelle de la session (de quelques heures à plusieurs semaines).
groups
string[]
Liste des groupes auxquels l’utilisateur appartient. Les pages dont le frontmatter contient des groups correspondants sont visibles pour cet utilisateur.Exemple : Un utilisateur avec groups: ["admin", "engineering"] peut accéder aux pages étiquetées avec les groupes admin ou engineering.
content
object
Données personnalisées accessibles dans votre contenu MDX via la variable user. Utilisez-les pour une personnalisation dynamique dans toute votre documentation.Exemple simple :
{ "firstName": "Ronan", "company": "Acme Corp", "plan": "Enterprise" }
Utilisation dans MDX :
Welcome back, {user.firstName}! Your {user.plan} plan includes...
Avec les données user de l’exemple, le rendu serait : Welcome back, Ronan! Your Enterprise plan includes…Rendu conditionnel avancé :
Authentication is an enterprise feature. {
  user.org === undefined
    ? <>To access this feature, first create an account at the <a href="https://dashboard.mintlify.com/login">Mintlify dashboard</a>.</>
    : user.org.plan !== 'enterprise'
      ? <>You are currently on the ${user.org.plan ?? 'free'} plan. See <a href="https://mintlify.com/pricing">our pricing page</a> for information about upgrading.</>
      : <>To request this feature for your enterprise org, contact your admin.</>
}
Les informations dans user ne sont disponibles que pour les utilisateurs connectés. Pour les utilisateurs déconnectés, la valeur de user sera {}. Pour éviter que la page ne plante pour les utilisateurs déconnectés, utilisez toujours l’enchaînement optionnel sur vos champs user. Par exemple, {user.org?.plan}.
apiPlaygroundInputs
object
Valeurs propres à l’utilisateur qui préremplissent les champs du Bac à sable API. Elles font gagner du temps en remplissant automatiquement ses données lors des tests d’API.Exemple :
{
  "header": { "X-API-Key": "user_api_key_123" },
  "server": { "subdomain": "foo" },
  "query": { "org_id": "12345" }
}
Si un utilisateur effectue des requêtes sur un sous-domaine spécifique, vous pouvez envoyer { server: { subdomain: 'foo' } } comme champ apiPlaygroundInputs. Cette valeur sera préremplie sur toute page API utilisant la valeur subdomain.
Les champs header, query et cookie ne seront préremplis que s’ils font partie de votre schéma de sécurité OpenAPI. Si un champ se trouve dans les sections Authorization ou Server, il sera prérempli. Créer un paramètre d’en-tête standard nommé Authorization n’activera pas cette fonctionnalité.

Exemple de données utilisateur

{
  "expiresAt": 1735689600,
  "groups": ["admin", "beta-users"],
  "content": {
    "firstName": "Jane",
    "lastName": "Smith",
    "company": "TechCorp",
    "plan": "Enterprise",
    "region": "us-west"
  },
  "apiPlaygroundInputs": {
    "header": {
      "Authorization": "Bearer abc123",
      "X-Org-ID": "techcorp"
    },
    "server": {
      "environment": "production",
      "region": "us-west"
    }
  }
}

Configuration de la personnalisation

Sélectionnez la méthode de handshake que vous souhaitez configurer.

Prérequis

  • Un système d’authentification capable de générer et de signer des JWT
  • Un service backend capable de créer des URL de redirection

Implémentation

1

Générez une clé privée.

  1. Dans votre tableau de bord, accédez à Authentication.
  2. Sélectionnez Personnalisation.
  3. Sélectionnez JWT.
  4. Saisissez l’URL de votre flux de connexion existant et sélectionnez Save changes.
  5. Sélectionnez Generate new key.
  6. Stockez votre clé de manière sécurisée afin qu’elle soit accessible par votre backend.
2

Intégrez la personnalisation Mintlify dans votre flux de connexion.

Modifiez votre flux de connexion existant pour inclure ces étapes après la connexion de l’utilisateur :
  • Créez un JWT contenant les informations de l’utilisateur connecté au format User. Voir la section User data format ci-dessus pour plus d’informations.
  • Signez le JWT avec la clé secrète, en utilisant l’algorithme ES256.
  • Créez une URL de redirection vers votre documentation, en incluant le JWT comme fragment.

Exemple

Votre documentation est hébergée sur docs.foo.com. Vous souhaitez que votre documentation soit séparée de votre tableau de bord (ou vous n’avez pas de tableau de bord) et activer la personnalisation.Générez un secret JWT. Puis créez un endpoint de connexion à https://foo.com/docs-login qui initie un flux de connexion vers votre documentation.Après vérification des identifiants de l’utilisateur :
  • Générez un JWT avec les données utilisateur au format Mintlify.
  • Signez le JWT et redirigez vers https://docs.foo.com#{SIGNED_JWT}.
import * as jose from 'jose';
import { Request, Response } from 'express';

const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2;

const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'ES256');

export async function handleRequest(req: Request, res: Response) {
  const user = {
    expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000),
    groups: res.locals.user.groups,
    content: {
      firstName: res.locals.user.firstName,
      lastName: res.locals.user.lastName,
    },
  };

  const jwt = await new jose.SignJWT(user)
    .setProtectedHeader({ alg: 'ES256' })
    .setExpirationTime('10 s')
    .sign(signingKey);

  return res.redirect(`https://docs.foo.com#${jwt}`);
}

Préserver les ancres de page

Pour rediriger les utilisateurs vers des sections spécifiques après la connexion, utilisez ce format d’URL : https://docs.foo.com/page#jwt={SIGNED_JWT}&anchor={ANCHOR}.Exemple :
  • URL d’origine : https://docs.foo.com/quickstart#step-one
  • URL de redirection : https://docs.foo.com/quickstart#jwt={SIGNED_JWT}&anchor=step-one