在现代的 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学习仓库