Конфигурация, аутентификация (Passport, JWT), Swagger
↑ 6.2 NestJS · ← Предыдущая · → Следующая
Зачем это на собесе
Типовая связка для настоящего Nest-проекта: конфиг, JWT и документация.
Объяснение
Конфигурация
ConfigModule.forRoot({
isGlobal: true,
validate: (env) => envSchema.parse(env), // fail fast при отсутствии переменных (zod/joi)
});
// использование
constructor(private cfg: ConfigService<Env, true>) { const url = cfg.get("DATABASE_URL", { infer: true }); }Переменные окружения — основной источник; .env только локально.
JWT и Passport
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(cfg: ConfigService) {
super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: cfg.get("JWT_SECRET") });
}
validate(payload: { sub: string; roles: string[] }) { return { id: payload.sub, roles: payload.roles }; }
}
@Injectable() export class JwtAuthGuard extends AuthGuard("jwt") {}
// выдача токена
const token = await this.jwt.signAsync({ sub: user.id, roles: user.roles }, { expiresIn: "15m" });Стратегии Passport: local (логин/пароль), jwt, OAuth-провайдеры. Пароли — argon2/bcrypt.
Swagger
const doc = SwaggerModule.createDocument(app, new DocumentBuilder().setTitle("Orders").addBearerAuth().build());
SwaggerModule.setup("docs", app, doc);Плагин @nestjs/swagger выводит схемы из DTO; декораторы @ApiProperty, @ApiResponse уточняют описание.
Нюансы и подводные камни
- Секрет JWT не в коде; для распределённых систем — асимметричные ключи и JWKS.
- Refresh-токены храните безопасно и ротируйте.
- Swagger в проде закрывайте или отключайте.
secretOrKeyиз конфигурации проверяйте при старте.
Практика
- Реализуйте регистрацию, логин и защищённый эндпоинт с JWT.
- Валидируйте переменные окружения через zod.
- Опишите API в Swagger и сгенерируйте клиент.
Вопросы с ответами
Как в Nest защитить эндпоинт JWT?
Стратегия
passport-jwt+AuthGuard("jwt")через@UseGuards.
Зачем валидировать конфигурацию при старте?
Приложение падает сразу при неверной настройке вместо ошибок в рантайме.