Passer au contenu

Cookies

Un HTTP cookie est un petit morceau de données stockées par le navigateur de l’utilisateur. Les cookies ont été conçus pour être un mécanisme fiable permettant aux sites Web de mémoriser des informations d’état. Lorsque l’utilisateur visite à nouveau le site Web, le cookie est automatiquement envoyé avec la requête.

Utilisation avec Express (par défaut)

Tout d’abord, installez le package requis (et ses types pour les utilisateurs de TypeScript) :

Fenêtre de terminal
$ npm i cookie-parser
$ npm i -D @types/cookie-parser

Une fois l’installation terminée, appliquez le middleware cookie-parser comme middleware global (par exemple, dans votre fichier main.ts).

Application du middleware cookie-parser
import * as cookieParser from 'cookie-parser';
// quelque part dans votre fichier d'initialisation
app.use(cookieParser());

Vous pouvez passer plusieurs options au middleware cookieParser :

  • secret une chaîne ou un tableau utilisé pour signer les cookies. Ceci est optionnel et, si non spécifié, ne parsèra pas les cookies signés. Si une chaîne est fournie, elle est utilisée comme secret. Si un tableau est fourni, une tentative sera faite pour désigner le cookie avec chaque secret dans l’ordre.
  • options un objet qui est passé à cookie.parse comme deuxième option. Voir cookie pour plus d’informations.

Le middleware analysera l’en-tête Cookie dans la requête et exposera les données du cookie en tant que propriété req.cookies et, si un secret a été fourni, en tant que propriété req.signedCookies. Ces propriétés sont des paires nom-valeur du nom de cookie à la valeur du cookie.

Lorsque un secret est fourni, ce module déferra et validera toutes les valeurs de cookies signés et déplacera ces paires nom-valeur de req.cookies à req.signedCookies. Un cookie signé est un cookie qui a une valeur préfixée par s:. Les cookies signés qui échouent à la validation de la signature auront la valeur false au lieu de la valeur altérée.

Avec cela en place, vous pouvez maintenant lire les cookies à l’intérieur des gestionnaires de routes, comme suit :

Lecture des cookies dans les gestionnaires de routes
@Get()
findAll(@Req() request: Request) {
console.log(request.cookies); // ou "request.cookies['cookieKey']"
// ou console.log(request.signedCookies);
}

Pour attacher un cookie à une réponse sortante, utilisez la méthode Response#cookie() :

Attacher un cookie à une réponse sortante
@Get()
findAll(@Res({ passthrough: true }) response: Response) {
response.cookie('key', 'value');
}

Utilisation avec Fastify

Tout d’abord, installez le package requis :

Fenêtre de terminal
$ npm i @fastify/cookie

Une fois l’installation terminée, enregistrez le plugin @fastify/cookie :

Enregistrement du plugin @fastify/cookie
import fastifyCookie from '@fastify/cookie';
// quelque part dans votre fichier d'initialisation
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
await app.register(fastifyCookie, {
secret: 'my-secret', // pour la signature des cookies
});

Avec cela en place, vous pouvez maintenant lire les cookies à l’intérieur des gestionnaires de routes, comme suit :

Lecture des cookies dans Fastify
@Get()
findAll(@Req() request: FastifyRequest) {
console.log(request.cookies); // ou "request.cookies['cookieKey']"
}

Pour attacher un cookie à une réponse sortante, utilisez la méthode FastifyReply#setCookie() :

Attacher un cookie à une réponse avec Fastify
@Get()
findAll(@Res({ passthrough: true }) response: FastifyReply) {
response.setCookie('key', 'value');
}

Pour en savoir plus sur la méthode FastifyReply#setCookie(), consultez cette page.

Création d’un décorateur personnalisé (cross-platform)

Pour fournir un moyen pratique et déclaratif d’accéder aux cookies entrants, nous pouvons créer un décorateur personnalisé.

Création d'un décorateur personnalisé pour les cookies
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const Cookies = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return data ? request.cookies?.[data] : request.cookies;
},
);

Le décorateur @Cookies() extraira tous les cookies, ou un cookie nommé de l’objet req.cookies et remplira le paramètre décoré avec cette valeur.

Avec cela en place, nous pouvons maintenant utiliser le décorateur dans la signature d’un gestionnaire de route, comme suit :

Utilisation du décorateur personnalisé dans un gestionnaire de route
@Get()
findAll(@Cookies('name') name: string) {
// ...
}