Nestjs:JwtStrategy 的方法不起作用

Nestjs: the methode of JwtStrategy doesn't work

我正在尝试在 nest 中使用 jwt 一切正常,但验证功能在 jwt.strategy.ts

中不起作用

这是我的 jwt.strategy.ts:

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
     private userService:UserService
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey:"mysecretkey",
    });
  }

  async validate(payload:any) {
      console.log('this is payload'+payload)

它打印:this is payload undefine

user.modul

@Module({
  exports:[UserService],
  controllers: [UserController],
  providers: [UserService,JwtStrategy],
  imports : [TypeOrmModule.forFeature([UserEntity]),PassportModule.register(
    {defaultStrategy:'jwt'}),
  JwtModule.register({secret:'mysecretkey',signOptions:{expiresIn:3600000}})]
})
export class UserModule {}

当我在邮递员中请求时,我得到 satus:401 Unauthorized 并且在 termenal show : payload undefined

如果您还没有,那么您必须定义扩展内置 AuthGuard 的 JwtAuthGuard class。

//jwt-auth.guard.ts
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

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

然后,您可以实现受保护的路由及其关联的Guard。 喜欢,

@UseGuards(JwtAuthGuard)
  @Get('profile')
  getProfile(@Request() req) {
    return req.user;
  }

参考Nestjs docs


编辑:

每次创建新用户都需要生成userToken。 Return 此 userToken 响应 CreateUser API 可由前端使用。此外,生成的 userToken 应在需要时用于 API 请求。

在您的 UserService 中注入此 AuthService class 并调用此方法生成 jwt 令牌。

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

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

  getJwtToken(userId: number, phone: string) {
    const payload = { userId: userId, userPhone: phone }; //Set whatever data you need to keep in your jwt
    return this.jwtService.sign(payload);
  }
}

我也遇到了这个错误。 在我的例子中,我使用这样的 secretOrKey:process.env.PRIVATE_KEY || 'SECRET'

而且我发现在 JwtStrategy(扩展了 PassportStrategy(Strategy))中使用了 process.env.PRIVATE_KEY,但是在 JwtModule.register({secret: process.env.PRIVATE_KEY || 'SECRET', ...}) 被使用 'SECRET'!

检查你的密钥。