Passer au contenu

Session

Les sessions HTTP offrent un moyen de stocker des informations sur l’utilisateur à travers plusieurs requêtes, ce qui est particulièrement utile pour les applications MVC.

Utiliser 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 express-session
$ npm i -D @types/express-session

Une fois l’installation terminée, appliquez le middleware express-session en tant que middleware global (par exemple, dans votre fichier main.ts) :

Configuration de express-session
import * as session from 'express-session';
// quelque part dans votre fichier d'initialisation
app.use(
session({
secret: 'my-secret',
resave: false,
saveUninitialized: false,
}),
);

Le secret est utilisé pour signer le cookie de session ID. Cela peut être soit une chaîne pour un secret unique, soit un tableau de plusieurs secrets. Si un tableau de secrets est fourni, seul le premier élément sera utilisé pour signer le cookie de session ID, tandis que tous les éléments seront considérés lors de la vérification de la signature dans les requêtes. Le secret lui-même ne doit pas être facilement déchiffrable par un humain et serait mieux sous la forme d’un ensemble de caractères aléatoires.

Activer l’option resave force la session à être enregistrée à nouveau dans le magasin de sessions, même si la session n’a jamais été modifiée pendant la requête. La valeur par défaut est true, mais l’utilisation de la valeur par défaut a été dépréciée, car celle-ci changera à l’avenir.

De même, activer l’option saveUninitialized force une session qui est “non initialisée” à être sauvegardée dans le magasin. Une session est non initialisée lorsqu’elle est nouvelle mais non modifiée. Choisir false est utile pour mettre en œuvre des sessions de connexion, réduire l’utilisation du stockage serveur ou se conformer aux lois qui nécessitent une autorisation avant de définir un cookie. Choisir false aidera également avec les conditions de concurrence où un client effectue plusieurs requêtes parallèles sans session (source).

Vous pouvez passer plusieurs autres options au middleware session, lisez-en plus à leur sujet dans la documentation API.

Avec cela en place, vous pouvez désormais définir et lire les valeurs de session depuis les gestionnaires de route, comme suit :

Utiliser les gestionnaires de route
@Get()
findAll(@Req() request: Request) {
request.session.visits = request.session.visits ? request.session.visits + 1 : 1;
}

Alternativement, vous pouvez utiliser le décorateur @Session() pour extraire un objet de session de la requête, comme suit :

Utiliser le décorateur @Session()
@Get()
findAll(@Session() session: Record<string, any>) {
session.visits = session.visits ? session.visits + 1 : 1;
}

Utiliser avec Fastify

Tout d’abord, installez le package requis :

Fenêtre de terminal
$ npm i @fastify/secure-session

Une fois l’installation terminée, enregistrez le plugin fastify-secure-session :

Configuration de fastify-secure-session
import secureSession from '@fastify/secure-session';
// quelque part dans votre fichier d'initialisation
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
await app.register(secureSession, {
secret: 'averylogphrasebiggerthanthirtytwochars',
salt: 'mq9hDxBVDbspDR6n',
});

Lisez plus sur les options disponibles dans le dépôt officiel.

Avec cela en place, vous pouvez maintenant définir et lire les valeurs de session depuis les gestionnaires de route, comme suit :

Utiliser les gestionnaires de route avec Fastify
@Get()
findAll(@Req() request: FastifyRequest) {
const visits = request.session.get('visits');
request.session.set('visits', visits ? visits + 1 : 1);
}

Alternativement, vous pouvez utiliser le décorateur @Session() pour extraire un objet de session de la requête, comme suit :

Utiliser le décorateur @Session() avec Fastify
@Get()
findAll(@Session() session: secureSession.Session) {
const visits = session.get('visits');
session.set('visits', visits ? visits + 1 : 1);
}