在 Nest.js 中使用 JWT 进行身份验证

在现代的 Web 应用程序中,身份验证是一个关键的安全要素。JWT(JSON Web Token)是一种用于安全传输信息的开放标准。Nest.js 是一个流行的 Node.js 框架,它提供了一种简单而强大的方式来构建可扩展的后端应用程序。在本文中,我们将介绍如何在 Nest.js 中使用 JWT 策略进行身份验证。

1. 安装所需的依赖

在开始之前,请确保您已经安装了 Node.js 和 Nest.js。可以通过以下命令来检查它们的安装情况:

node -v
nest --version

在 Nest.js 中使用 JWT 策略需要安装一些额外的依赖。使用以下命令来安装这些依赖:

npm install @nestjs/jwt passport passport-jwt

2. 创建 JWT 策略

在 Nest.js 中,我们可以创建一个 JWT 策略来处理 JWT 的验证。创建一个名为 jwt.strategy.ts 的文件,并添加以下内容:

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, ExtractJwt } from 'passport-jwt';
import { AuthService } from './auth.service';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: 'your_secret_key',
    });
  }

  async validate(payload: any) {
    // 在这里进行用户验证逻辑
    // 返回一个包含用户信息的对象
  }
}

在上述代码中,我们创建了一个名为 JwtStrategy 的类,继承自 PassportStrategy 类,并使用 Strategy 和 ExtractJwt 类来实现 JWT 策略。在构造函数中,我们传递了一个配置对象,其中包含了从请求中提取 JWT 的方式和密钥。然后,我们实现了 validate() 方法来验证 JWT,并返回一个包含用户信息的对象。

3. 创建身份验证服务

在 Nest.js 中,我们可以创建一个身份验证服务来处理用户验证逻辑。创建一个名为 auth.service.ts 的文件,并添加以下内容:

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';

@Injectable()
export class AuthService {
  constructor(private readonly jwtService: JwtService) {}

  async generateToken(payload: any): Promise<string> {
    return this.jwtService.sign(payload);
  }
}

在上述代码中,我们创建了一个名为 AuthService 的类,用于生成 JWT。在 generateToken() 方法中,我们使用 jwtService.sign() 方法生成 JWT。

4. 配置 JWT 模块和策略

在应用程序的根模块中,我们需要配置 JWT 模块和策略。打开 app.module.ts 文件,并进行如下配置:

import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './jwt.strategy';
import { AuthService } from './auth.service';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    PassportModule,
    JwtModule.register({
      secret: 'your_secret_key',
      signOptions: { expiresIn: '1h' },
    }),
  ],
  providers: [AuthService, JwtStrategy],
  controllers: [AppController],
})
export class AppModule {}

在上述代码中,我们使用 PassportModule 来配置身份验证模块。然后,我们注册了 JWT 模块,并传递了一个配置对象,其中包含了密钥和令牌的过期时间。最后,我们提供了 AuthService 和 JwtStrategy

5. 保护路由

现在,我们可以在需要进行身份验证的路由上使用 JWT 策略来保护它们。在你的控制器中,使用 @UseGuards() 装饰器来应用 JWT 策略。例如:

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

@Controller('protected')
export class ProtectedController {
  @Get()
  @UseGuards(JwtAuthGuard)
  protectedRoute() {
    // 这个路由需要进行身份验证
    // 只有经过身份验证的用户才能访问
  }
}

在上述代码中,我们使用 @UseGuards() 装饰器来应用 JwtAuthGuard,它是一个自定义的守卫,用于验证 JWT。

6. 创建自定义的 JWT 守卫

最后,我们需要创建一个自定义的 JWT 守卫来实际执行身份验证逻辑。创建一个名为 jwt-auth.guard.ts 的文件,并添加以下内容:

import { Injectable, ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }
}

在上述代码中,我们创建了一个名为 JwtAuthGuard 的类,继承自 AuthGuard 类,并使用 'jwt' 参数来指定使用 JWT 策略。然后,我们实现了 canActivate() 方法来执行身份验证逻辑。

现在,当你访问被 @UseGuards(JwtAuthGuard) 保护的路由时,Nest.js 将自动执行 JWT 策略,并验证 JWT 的有效性。

这就是在 Nest.js 中使用 JWT 策略进行身份验证的基本步骤。你可以根据自己的需求进行进一步的定制和扩展。希望这对你有帮助!

自己做的案例gitee:Nestjs: nestjs学习仓库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NestJS ,通过使用 @UseGuards() 装饰器,可以将守卫(Guard)应用于控制器或者处理程序方法。AuthGuard 是 NestJS 内置的一个守卫,用于验证用户是否已通过身份验证,并允许访问受保护的端点。 在使用 @UseGuards(AuthGuard()) 时,AuthGuard 可以带有一个可选参数。这个参数可以是一个字符串,也可以是一个类。当参数是一个字符串时,它指定了要使用身份验证策略的名称。通常情况下,身份验证策略是在全局模块或者具有身份验证功能的共享模块定义的,可以使用 @Injectable() 装饰器将其导出为供守卫使用的服务。 当参数是一个类时,它必须实现了 CanActivate 接口,用于验证用户是否已通过身份验证,并允许访问受保护的端点。这个类可以使用 @Injectable() 装饰器来将其导出为供守卫使用的服务。 例如,下面是一个使用自定义守卫的示例: ```typescript import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class CustomAuthGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { // 在这里实现自定义的身份验证逻辑 return true; } } ``` 然后,在控制器或者处理程序方法使用 CustomAuthGuard,就可以保护对应的端点: ```typescript import { Controller, Get, UseGuards } from '@nestjs/common'; import { CustomAuthGuard } from './custom-auth.guard'; @Controller('protected') export class ProtectedController { @Get() @UseGuards(CustomAuthGuard) findAll(): string { return 'This action is protected by custom guard'; } } ``` 在这个例子,CustomAuthGuard 是一个自定义的守卫,用于实现身份验证逻辑,并保护 /protected 端点。在 @UseGuards() 装饰器,我们传入了 CustomAuthGuard 类名,表示要使用这个自定义守卫。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值