Как NestJS поддерживает аутентификацию и авторизацию?
NestJS предоставляет мощные инструменты и популярные подходы для реализации аутентификации и авторизации в веб-приложениях. В этом ответе мы подробно рассмотрим, как это можно сделать с помощью NestJS, включая примеры кода.
1. Основные концепции
- Аутентификация — это процесс проверки личности пользователя. Чаще всего это делается с помощью логина и пароля.
- Авторизация — это процесс проверки прав пользователя на выполнение определенных действий или доступ к ресурсам.
В NestJS для аутентификации и авторизации чаще всего используются middleware, guards и decorators.
2. Установка необходимых пакетов
Для начала работы с аутентификацией и авторизацией придется установить несколько пакетов. Для аутентификации с использованием JWT (JSON Web Token) установим следующие зависимости:
npm install @nestjs/jwt passport passport-jwt
npm install @nestjs/passport
3. Настройка модуля аутентификации
Создадим модуль аутентификации (auth.module.ts
):
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
PassportModule,
JwtModule.register({
secret: 'your_secret_key', // Убедитесь, что этот ключ хранится в безопасном месте
signOptions: { expiresIn: '60s' }, // Токен будет действителен 60 секунд
}),
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy],
})
export class AuthModule {}
4. Реализация сервиса аутентификации
Создадим сервис аутентификации (auth.service.ts
):
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(private readonly jwtService: JwtService) {}
async login(user: { username: string }): Promise<{ access_token: string }> {
const payload = { username: user.username };
return {
access_token: this.jwtService.sign(payload),
};
}
}
5. Создание контроллера аутентификации
Создадим контроллер аутентификации (auth.controller.ts
):
import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';
@Controller('auth')
export class AuthController {
constructor(private readonly authService: AuthService) {}
@Post('login')
async login(@Body() user: { username: string }): Promise<{ access_token: string }> {
return this.authService.login(user);
}
}
6. Реализация стратегии JWT
Создадим стратегию JWT (jwt.strategy.ts
):
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'your_secret_key', // Должен соответствовать ключу из jwt.module.ts
});
}
async validate(payload: any) {
// Здесь вы можете реализовать логику по извлечению пользователя на основе payload
return { userId: payload.sub, username: payload.username };
}
}
7. Защита маршрутов с помощью Guards
Теперь, когда у нас есть структура для аутентификации, можно защищать маршруты с помощью guards. Например, создадим guard для проверки JWT:
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
Теперь мы можем использовать этот guard в любом контроллере:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from './jwt-auth.guard';
@Controller('protected')
export class ProtectedController {
@UseGuards(JwtAuthGuard)
@Get()
getProtectedResource() {
return { message: 'Этот ресурс защищен!' };
}
}
Заключение
После выполнения этих шагов вы настроите базовую систему аутентификации и авторизации в своем приложении на NestJS. При необходимости можно расширить функционал, добавив различные уровни доступа, обработку пользовательских ролей и другие сложные сценарии.
Помните, что безопасность — это важная часть разработки, и всегда следите за тем, чтобы ваши ключи и доступы были защищены.