Конфигурация, аутентификация (Passport, JWT), Swagger

↑ 6.2 NestJS · ← Предыдущая · → Следующая

По желанию~3 мин чтенияУровень: junior

Зачем это на собесе

Типовая связка для настоящего 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 из конфигурации проверяйте при старте.

Практика

  1. Реализуйте регистрацию, логин и защищённый эндпоинт с JWT.
  2. Валидируйте переменные окружения через zod.
  3. Опишите API в Swagger и сгенерируйте клиент.

Вопросы с ответами

Связанные темы