1

我正在尝试在嵌套中使用 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)

它打印:这是有效载荷 undefine

用户模块

@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 并且在终端显示:payload undefined

4

1 回答 1

0

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

//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 文档


编辑:

每次创建新用户时都需要生成 userToken。返回此 userToken 作为前端可以使用的 CreateUser API 的响应。此外,生成的 userToken 应在任何需要的 API 请求中使用。

在您的 UserService 类中注入此 AuthService 并调用此方法以生成 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);
  }
}

于 2021-09-20T07:49:40.953 回答