返回

解锁 NestJS 中的身份验证:护航您的应用安全

前端

导语:
在当今瞬息万变的数字世界中,构建安全的应用程序至关重要。随着网络攻击和数据泄露事件的不断增加,保护用户数据和应用程序资源免受未经授权的访问变得更加紧迫。在本文中,我们将踏上 NestJS 身份验证的奇妙旅程,探索如何利用 Passport 和 JWT 来保障您的应用程序安全。

1. 身份验证概述:

身份验证是确保只有授权用户才能访问应用程序或其资源的机制。它可以防止未经授权的访问、数据泄露和应用程序滥用。在 NestJS 中,我们可以使用 Passport 来轻松实现身份验证。Passport 是一个流行的 Node.js 库,用于轻松构建身份验证策略,而 JWT(JSON Web Token)则是一种流行的用于在两个 parties 之间安全地传输信息的方法。

2. 设置 Passport:

在 NestJS 中使用 Passport 的第一步是将其安装到您的项目中。您可以使用以下命令:

npm install passport passport-local passport-jwt

接下来,您需要创建一个 Passport 模块。在这个模块中,您将定义您的身份验证策略。策略是 Passport 用于决定用户是否可以访问应用程序或其资源的规则。

3. 创建身份验证策略:

现在,让我们创建一个名为 LocalStrategy 的本地身份验证策略。这个策略将使用用户名和密码来验证用户。

import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super();
  }

  async validate(username: string, password: string): Promise<any> {
    const user = await this.authService.validateUser(username, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

在这个策略中,我们使用 validate 方法来验证用户。这个方法将用户名和密码作为参数,并返回一个 Promise,其中包含经过验证的用户对象或 undefined

4. 使用 Passport:

现在,您已经创建了身份验证策略,下一步就是将其应用到您的应用程序。您可以通过在 app.module.ts 文件中导入 Passport 模块并将其添加到 imports 数组中来实现这一点。

import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';

@Module({
  imports: [PassportModule.register({ defaultStrategy: 'local' }), LocalStrategy],
})
export class AppModule {}

5. 保护路由:

现在,您已经设置了 Passport,接下来就可以使用它来保护您的路由。您可以通过在路由处理程序中使用 @UseGuards 装饰器来实现这一点。

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('protected')
export class ProtectedController {
  @Get()
  @UseGuards(AuthGuard('local'))
  getProtectedData() {
    return { message: 'Welcome to the protected data!' };
  }
}

在上面的代码中,我们使用 @UseGuards(AuthGuard('local')) 装饰器来保护 getProtectedData 路由。这意味着只有通过身份验证的用户才能访问这个路由。

6. 使用 JWT 进行身份验证:

除了本地身份验证之外,您还可以使用 JWT 进行身份验证。JWT 是一种流行的用于在两个 parties 之间安全地传输信息的方法。您可以通过安装 passport-jwt 库来实现这一点。

npm install passport-jwt

接下来,您需要创建一个 JWT 策略。您可以通过以下方式创建:

import { Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username };
  }
}

在这个策略中,我们使用 validate 方法来验证 JWT。这个方法将 JWT 作为参数,并返回一个 Promise,其中包含经过验证的用户对象或 undefined

7. 使用 JWT 保护路由:

现在,您已经创建了 JWT 策略,接下来就可以使用它来保护您的路由。您可以通过在路由处理程序中使用 @UseGuards 装饰器来实现这一点。

import { Controller, Get, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from './jwt-auth.guard';

@Controller('jwt-protected')
export class JwtProtectedController {
  @Get()
  @UseGuards(JwtAuthGuard)
  getProtectedData() {
    return { message: 'Welcome to the JWT-protected data!' };
  }
}

在上面的代码中,我们使用 @UseGuards(JwtAuthGuard) 装饰器来保护 getProtectedData 路由。这意味着只有通过 JWT 身份验证的用户才能访问这个路由。

结语:

在本文中,我们深入探索了 NestJS 中的身份验证,学习了如何使用 Passport 和 JWT 来保护您的应用程序免受未经授权的访问。我们从设置 Passport 开始,了解了如何创建本地身份验证策略和 JWT 策略。然后,我们学习了如何使用 Passport 和 JWT 来保护路由,从而确保只有通过身份验证的用户才能访问应用程序的受保护资源。希望这篇文章对您有所帮助,祝您在 NestJS 中构建安全的应用程序。