Поиск по сайту
Ctrl + K
Вопросы по Nest.js

Как 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. При необходимости можно расширить функционал, добавив различные уровни доступа, обработку пользовательских ролей и другие сложные сценарии.

Помните, что безопасность — это важная часть разработки, и всегда следите за тем, чтобы ваши ключи и доступы были защищены.

Содержание:
Редактировать