Nestjs:验证功能不适用于 jwt

jie*_*jie 2 node.js jwt typescript nestjs

我正在尝试在嵌套以下文档中使用 jwt

一切正常,但验证功能在 jwt.strategy.ts 中不起作用

这是我的 jwt.strategy.ts:

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

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

  async validate(payload: JwtPayload) {
    console.log(payload)
    // const user = await this.authService.validateUser(payload);
    // if (!user) {
    //   throw new UnauthorizedException();
    // }
    // return user;
  }
}
Run Code Online (Sandbox Code Playgroud)

auth.module.ts:


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

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secretOrPrivateKey: 'secretKey',
      signOptions: {
        expiresIn: 3600,
      },
    }),
  ],
  providers: [AuthService, JwtStrategy],
})
export class AuthModule {}

Run Code Online (Sandbox Code Playgroud)

app.module.ts:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { GraphQLModule } from '@nestjs/graphql';
import { AuthModule } from './auth/auth.module';

@Module({
  imports: [
    TypeOrmModule.forRoot(),
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
    }),
    AuthModule,
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Run Code Online (Sandbox Code Playgroud)

当我在邮递员中请求时,我没有任何日志,它似乎没有输入此验证功能。:

在此处输入图片说明

这是完整的代码

对不起,我的英文不好,这是我第一次使用stackoverflow,谢谢你的帮助

Kim*_*ern 8

validate您的方法JwtStrategy只会在令牌已通过加密验证(在您的情况下使用正确的密钥对其进行签名secretKey)并且未过期时才会被调用。只有在检查了这两件事之后,validate才会使用有效负载调用。有了它,您就可以例如检查用户是否仍然存在。所以这三个步骤是:

  1. 令牌已用您的密钥签名
  2. 令牌未过期
  3. 自定义负载验证

您可以使用jwt 调试器手动检查您的令牌的步骤 1 和 2。