使用 NestJs 和 Passport jwt 进行身份验证是构建安全的 Node.js 应用程序的常见方法之一。Passport 是一个灵活且可扩展的身份验证库,而 jwt 是一种无状态的认证方式,可以方便地在前后端之间传递用户身份信息。本文将介绍如何在 NestJs 中使用 Passport jwt 策略进行身份验证,并提供一个案例代码来帮助读者理解。
什么是 Passport jwt 策略?Passport 提供了多种身份验证策略,其中之一就是 jwt 策略。jwt(Json Web Token)是一种基于 JSON 的安全令牌,可以包含用户的身份信息以及其他自定义的数据。通过在用户登录成功后生成一个 jwt,并将其保存在客户端的 Cookie 或本地存储中,我们可以在后续的请求中使用该 jwt 来验证用户的身份。如何在 NestJs 中使用 Passport jwt 策略?首先,我们需要安装相关的依赖包。打开终端,并在你的 NestJs 项目根目录下执行以下命令:bashnpm install --save @nestjs/passport passport passport-jwt安装完成后,我们需要创建一个 Passport jwt 策略。在你的项目中创建一个新的文件,命名为 `jwt.strategy.ts`,并添加以下代码:
typescriptimport { Strategy, ExtractJwt } from 'passport-jwt';import { PassportStrategy } from '@nestjs/passport';import { Injectable, UnauthorizedException } from '@nestjs/common';import { AuthService } from './auth.service';import { JwtPayload } from './interfaces/jwt-payload.interface';@Injectable()export class JwtStrategy extends PassportStrategy(Strategy) { constructor(private authService: AuthService) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: 'your-secret-key', }); } async validate(payload: JwtPayload) { const user = await this.authService.validateUserById(payload.userId); if (!user) { throw new UnauthorizedException(); } return user; }}在上述代码中,我们创建了一个 `JwtStrategy` 类,并继承了 Passport 的 `Strategy` 类。在构造函数中,我们配置了 jwt 的提取方式和密钥(请替换为你自己的密钥)。然后,我们实现了 `validate` 方法,用于验证 jwt 的有效性并返回用户信息。如果验证失败,我们会抛出一个 `UnauthorizedException` 异常。接下来,我们需要在我们的应用程序中使用这个策略。打开你的 `auth.module.ts` 文件,并添加以下代码:typescriptimport { Module } from '@nestjs/common';import { PassportModule } from '@nestjs/passport';import { JwtModule } from '@nestjs/jwt';import { AuthService } from './auth.service';import { JwtStrategy } from './jwt.strategy';@Module({ imports: [ PassportModule.register({ defaultStrategy: 'jwt' }), JwtModule.register({ secret: 'your-secret-key', signOptions: { expiresIn: '1h' }, }), ], providers: [AuthService, JwtStrategy], exports: [PassportModule, JwtModule],})export class AuthModule {}在上述代码中,我们使用了 `PassportModule` 和 `JwtModule` 来配置 Passport 和 jwt。我们将 `defaultStrategy` 设置为 `'jwt'`,以便在需要验证用户身份的地方自动应用 jwt 策略。我们还配置了 jwt 的密钥和过期时间。如何在 NestJs 控制器中使用 Passport jwt 策略?现在,我们已经完成了 Passport jwt 策略的配置,接下来我们将在一个简单的控制器中使用它。打开你的控制器文件,并添加以下代码:typescriptimport { Controller, Get, UseGuards } from '@nestjs/common';import { AuthGuard } from '@nestjs/passport';import { UserService } from './user.service';@Controller('users')export class UserController { constructor(private userService: UserService) {} @Get() @UseGuards(AuthGuard('jwt')) async findAll() { return this.userService.findAll(); }}在上述代码中,我们使用了 `@UseGuards(AuthGuard('jwt'))` 装饰器来应用 Passport jwt 策略。这意味着在执行 `findAll` 方法之前,会先验证用户的身份。如果验证失败,请求将被拒绝并返回一个未经授权的错误。通过使用 NestJs 和 Passport jwt 策略,我们可以轻松地实现身份验证功能,并保护我们的应用程序免受未经授权的访问。本文介绍了如何在 NestJs 中配置和使用 Passport jwt 策略,并提供了一个简单的案例代码来帮助读者理解。希望本文能对你在构建安全的 Node.js 应用程序时有所帮助!