Подпись куки в Nest
Клиент может изменить текст куки вручную. Если там лежит идентификатор или флаг доступа, серверу нужно проверять, что значение не трогали после выдачи.
Секрет задают вторым аргументом
при создании приложения в объекте
cookies. Запись с флагом
подписи идёт через адаптер, чтение
подписанного значения - отдельной
пометкой параметра из общего пакета.
При неверной подписи в аргумент
попадёт undefined.
Покажем на примере постов:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module.js';
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
cookies: { secret: 'dev-secret' },
});
await app.listen(process.env.PORT ?? 3000);
}
await bootstrap();
Контроллер запишет и прочитает подписанное значение:
import {
Body,
Controller,
Get,
Put,
Res,
SignedCookies,
} from '@nestjs/common';
import { HttpAdapterHost } from '@nestjs/core';
import type { Response } from 'express';
@Controller('posts')
export class PostController {
adapterHost: HttpAdapterHost;
constructor(adapterHost: HttpAdapterHost) {
this.adapterHost = adapterHost;
}
@Put('viewer')
setViewer(
@Body('viewer') viewer: string,
@Res({ passthrough: true }) response: Response,
): string {
this.adapterHost.httpAdapter.setCookie(
response,
'viewer',
viewer,
{ signed: true },
);
return viewer;
}
@Get('viewer')
getViewer(
@SignedCookies('viewer') viewer: string | undefined,
): string {
return viewer ?? 'guest';
}
}
Настройте секрет при создании
приложения работников, запишите
подписанную куку идентификатора
через WorkerController
и верните её только если подпись
верна.