在nestjs中集成jwt校验
jwt
jwt (json web token) 是 通过json的形式在网络中传输的一种协议。
jwt 的优势在于它可以支持跨端在 小程序或者手机端进行使用。
一般情况下,它包括三部分 header、payload、signature 。
可在工具网站中生成jwt:jwt生成工具
在nestjs中使用jwt
依赖安装:pnpm i @nestjs/jwt passport-jwt passport @nestjs/passport
passport 是一个用于处理认证和授权的 Node.js 模块。jwt这个包只是其中的一种策略,nestjs对其也有一定的封装,所以要使用jwt,这些包都需要安装。
策略设置并完成jwt的验证
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { getServerConfig } from '../config/server.config';
import { ConfigEnum } from '../enum/config.enum';@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {constructor() {super({jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),ignoreExpiration: false,secretOrKey: getServerConfig()?.[ConfigEnum.JWT_SECRET] as string,//可以写在环境变量中作为密钥});}async validate(payload: { sub: number; username: string; email: string }) {return { userId: payload.sub, username: payload.username, email: payload.email };}
}
为了便于使用可以进一步封装一个守卫
import { AuthGuard } from '@nestjs/passport';
export class JwtGuard extends AuthGuard('jwt') {constructor() {super();}
}
只需要在需要验证的接口上添加 @UseGuards(JwtGuard) 就可以了,
在使用这个装饰器时要注意生效的顺序,如果多个守卫都生效,那么会按照顺序执行。
如果是用了多个useguards,会从下到上执行。
如果前一个失败了,就不会继续执行后面的守卫。
