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) :
$ 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
).
import * as cookieParser from 'cookie-parser';// quelque part dans votre fichier d'initialisationapp.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 :
@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()
:
@Get()findAll(@Res({ passthrough: true }) response: Response) { response.cookie('key', 'value');}
Utilisation avec Fastify
Tout d’abord, installez le package requis :
$ npm i @fastify/cookie
Une fois l’installation terminée, enregistrez le plugin @fastify/cookie
:
import fastifyCookie from '@fastify/cookie';
// quelque part dans votre fichier d'initialisationconst 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 :
@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()
:
@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é.
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 :
@Get()findAll(@Cookies('name') name: string) { // ...}