# Cookies

{% hint style="info" %}
Rendez-vous dans nos guides pour trouver un [guide complet](https://app.gitbook.com/s/LBGJKQic7BQYBXmVSjy0/docs-personalization-and-authentication/setting-up-adaptive-content) sur la configuration de contenu adaptatif avec des cookies.
{% endhint %}

{% hint style="warning" %}
L’utilisation de contenu adaptatif avec des drapeaux de fonctionnalités nécessite d’ajouter du code à votre application.

Cette méthode ne fonctionne que si votre site est servi sous un [domaine personnalisé](https://gitbook-v2-q67etdj25-gitbook.vercel.app/url/gitbook.com/docs/documentation/fr/publishing-documentation/custom-domain).
{% endhint %}

Vous pouvez transmettre des données de visiteur à votre documentation via les cookies du navigateur de vos visiteurs. Voici un aperçu des différentes méthodes.

<table data-full-width="false"><thead><tr><th width="335.125">Méthode</th><th width="266.6015625">Cas d’utilisation</th><th width="206.58984375">Facilité de configuration</th><th width="202">Sécurité</th><th>Format</th></tr></thead><tbody><tr><td>Cookie signé <code>gitbook-visitor-token</code></td><td>Identifiants de test de l’API, identification du client</td><td>Nécessite une signature et un domaine personnalisé</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> Les propriétés ne peuvent être définies que par le backend</td><td>JWT</td></tr><tr><td>Cookie public <code>gitbook-visitor-public</code></td><td>Drapeaux de fonctionnalités, rôles</td><td>Facile à configurer</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> Le visiteur peut remplacer les propriétés</td><td>JSON</td></tr></tbody></table>

### Cookie public

Pour transmettre des données à GitBook à partir d’un cookie public, vous devrez envoyer les données depuis votre application en définissant un cookie public `gitbook-visitor-public` cookie.

Voici un simple exemple en JavaScript :

```javascript
import Cookies from 'js-cookie';

const cookieData = {
  isLoggedIn: true,
  isBetaUser: false,
};

Cookies.set('gitbook-visitor-public', JSON.stringify(cookieData), {
  secure: true,
  domain: '*.acme.org',
})
```

{% hint style="warning" %}
Les données transmises via des cookies publics doivent être définies dans votre schéma de visiteur via un [non signé](https://gitbook.com/docs/publishing-documentation/adaptive-content/enabling-adaptive-content#setting-unsigned-claims) objet.
{% endhint %}

### Cookie signé

Pour transmettre des données à GitBook de manière plus sécurisée, vous devrez envoyer les données sous la forme d’un [JSON Web Token](https://jwt.io/introduction) depuis votre application dans un cookie nommé `gitbook-visitor-token` rattaché à votre domaine.

Pour configurer cela, vous devrez adapter le flux de connexion de votre application pour inclure les étapes suivantes :

{% stepper %}
{% step %}
**Générer un JWT lorsque les utilisateurs se connectent à votre application**

Chaque fois qu’un utilisateur se connecte à votre produit, générez un JWT contenant certains attributs des informations de votre utilisateur authentifié.
{% endstep %}

{% step %}
**Signer le JWT à l’aide de la clé de signature des visiteurs du site**

Ensuite, veillez à signer le JWT à l’aide de la **clé de signature des visiteurs**du site, que vous pouvez trouver dans les paramètres d’audience de votre site après avoir activé le contenu adaptatif.
{% endstep %}

{% step %}
**Stocker le JWT dans un cookie de session générique**

Enfin, vous devez stocker le JWT signé contenant les informations de votre utilisateur dans un cookie de session générique **sous le domaine de votre produit**.

Par exemple, si votre application est servie derrière le `app.acme.org` domaine, le cookie devra être créé sous le `.acme.org` domaine générique.
{% endstep %}
{% endstepper %}

Voici un simple exemple en TypeScript :

```typescript
import * as jose from 'jose';

import { Request, Response } from 'express';

import { getUserInfo } from '../services/user-info-service';
import { getFeatureFlags } from '../services/feature-flags-service';

const GITBOOK_VISITOR_SIGNING_KEY = process.env.GITBOOK_VISITOR_SIGNING_KEY;
const GITBOOK_VISITOR_COOKIE_NAME = 'gitbook-visitor-token';


export async function handleAppLoginRequest(req: Request, res: Response) {
   // Votre logique métier pour gérer la requête de connexion
   // Par exemple, vérifier les identifiants et authentifier l’utilisateur
   //
   // par ex. :
   // const loggedInUser = await authenticateUser(req.body.username, req.body.password);

   // Après avoir authentifié l’utilisateur, récupérez les informations utilisateur que vous souhaitez
   // transmettre à GitBook depuis votre base de données ou votre service utilisateur.
   const userInfo = await getUserInfo(loggedInUser.id);
      
   // Construisez la charge utile JWT avec les informations de l’utilisateur
   const gitbookVisitorClaims = {
       firstName: userInfo.firstName,
       lastName: userInfo.lastName,
       isBetaUser: userInfo.isBetaUser
       products: userInfo.products.map((product) => product.name),
       featureFlags: await getFeatureFlags({userId: loggedInUser.id})
   }
   
   // Générer un JWT signé à l’aide des revendications
   const gitbookVisitorJWT = await new jose.SignJWT(gitbookVisitorClaims)
     .setProtectedHeader({ alg: 'HS256' })
     .setIssuedAt()
     .setExpirationTime('2h') // expiration arbitraire de 2 heures
     .sign(GITBOOK_VISITOR_SIGNING_KEY);
     
  // Inclure un cookie `gitbook-visitor-token` contenant le JWT encodé dans votre
  // réponse du gestionnaire de connexion
  res.cookie(GITBOOK_VISITOR_COOKIE_NAME, gitbookVisitorJWT, {
     httpOnly: true,
     secure: process.env.NODE_ENV === 'production',
     maxAge: 2 * 60 * 60 * 1000, // expiration arbitraire de 2 heures
     domain: '.acme.org' //
  });
  
  // Reste de la logique de votre gestionnaire de connexion, y compris la redirection de l’utilisateur vers votre application
  res.redirect('/'); // Exemple de redirection
}
```
