NestJS:使用 JWT 将验证选项添加到 AuthGuard

作者:编程家 分类: 编程代码 时间:2025-07-26

使用 JWT 将验证选项添加到 AuthGuard

在开发Web应用程序时,身份验证和授权是非常重要的方面。NestJS作为一个强大的框架,提供了许多内置的工具来简化身份验证和授权的实现。其中,AuthGuard是一个非常有用的装饰器,用于保护路由和处理程序,确保只有经过身份验证的用户才能访问它们。

而JWT(JSON Web Token)是一种流行的身份验证机制,它使用签名的JSON对象作为令牌,用于验证用户的身份和权限。在本文中,我将介绍如何使用JWT将验证选项添加到AuthGuard,以确保只有有效的JWT令牌的用户才能访问受保护的路由。

添加JWT验证选项

首先,我们需要安装一些必要的依赖项。在NestJS项目的根目录中,运行以下命令:

bash

npm install @nestjs/jwt passport-jwt

安装完成后,我们可以开始添加JWT验证选项到AuthGuard中了。在NestJS中,我们可以通过创建一个自定义的AuthGuard来实现这一点。

首先,让我们创建一个名为JwtAuthGuard的类,并扩展自AuthGuard类:

typescript

import { AuthGuard } from '@nestjs/passport';

export class JwtAuthGuard extends AuthGuard('jwt') {}

接下来,我们需要在应用程序的主模块中导入和配置一些模块。打开app.module.ts文件,并添加以下代码:

typescript

import { Module } from '@nestjs/common';

import { JwtModule } from '@nestjs/jwt';

import { PassportModule } from '@nestjs/passport';

import { JwtAuthGuard } from './jwt-auth.guard';

@Module({

imports: [

PassportModule.register({ defaultStrategy: 'jwt' }),

JwtModule.register({

secret: 'your-secret-key',

signOptions: { expiresIn: '1h' },

}),

],

providers: [JwtAuthGuard],

})

export class AppModule {}

在上面的代码中,我们导入了PassportModule和JwtModule,并将JwtAuthGuard添加到providers数组中。同时,我们还配置了PassportModule的默认策略为'jwt',并设置了JwtModule的密钥和过期时间。

保护路由

现在,我们已经完成了添加JWT验证选项的准备工作,接下来我们可以使用JwtAuthGuard来保护我们的路由了。在NestJS中,我们可以使用@UseGuards()装饰器将AuthGuard应用于路由或处理程序。

让我们假设我们有一个名为"ProtectedController"的控制器,并且我们想要保护其中的一个路由。打开protected.controller.ts文件,并添加以下代码:

typescript

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

import { JwtAuthGuard } from './jwt-auth.guard';

@Controller('protected')

export class ProtectedController {

@Get()

@UseGuards(JwtAuthGuard)

protectedRoute() {

return 'This route is protected';

}

}

在上面的代码中,我们使用@UseGuards()装饰器将JwtAuthGuard应用于protectedRoute()方法。这将确保只有经过身份验证的用户才能访问该路由。

验证JWT令牌

最后,我们需要添加一些代码来验证JWT令牌。打开jwt-auth.guard.ts文件,并修改JwtAuthGuard类的代码如下:

typescript

import { AuthGuard } from '@nestjs/passport';

export class JwtAuthGuard extends AuthGuard('jwt') {

handleRequest(err, user, info) {

if (err || !user) {

throw err || new UnauthorizedException();

}

return user;

}

}

在上面的代码中,我们重写了AuthGuard的handleRequest()方法,并在用户不存在或出现错误的情况下抛出异常。这将确保只有有效的JWT令牌的用户才能访问受保护的路由。

通过使用JWT将验证选项添加到AuthGuard,我们可以轻松地保护NestJS应用程序中的路由和处理程序。首先,我们创建了一个自定义的AuthGuard,并在主模块中配置了PassportModule和JwtModule。然后,我们使用@UseGuards()装饰器将JwtAuthGuard应用于需要保护的路由或处理程序。最后,我们验证JWT令牌并确保只有有效的令牌的用户才能访问受保护的路由。

希望本文对你理解如何使用JWT将验证选项添加到AuthGuard有所帮助。祝你在NestJS开发中取得成功!

以上是文章的完整内容,我们通过添加JWT验证选项到AuthGuard,实现了对NestJS应用程序中路由和处理程序的保护。希望这篇文章对你理解NestJS中身份验证和授权的实现有所帮助。