Nestjs Passport-jwt 更好的未授权策略

Nestjs Passport-jwt better Unauthorized strategy

只是浏览有关 NestJS 身份验证的文档:docs.nestjs.com

代码如下:

import { ExtractJwt, Strategy } from 'passport-jwt';  
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: jwtConstants.secret,
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username };
  }
}

根据文档,当请求包含 jwt 并且 jwt 有效时调用验证方法。 我想知道当请求 header 中缺少 jwt 或 jwt 无效或过期时,是否有回调方法。我想 return 响应错误并向客户发送他们的令牌已过期或丢失的消息...

谢谢

您可以实施自定义策略并根据需要检查 headers 或 cookie。这是我在我的应用程序中使用的(缩短的)示例。

import { JwtService } from '@nestjs/jwt';
import { Strategy } from 'passport-custom';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'custom-jwt') {
  constructor(private readonly jwtService: JwtService) {
    super();
  }

  async validate(req: Request): Promise<any> {
    const token = req.cookies.auth ?? req.headers.authorization;
    if (!token) {
      throw new UnauthorizedException();
    }

    const user = this.jwtService.decode(token, {
      json: true
    });

    if (!user) {
      throw new UnauthorizedException();
    }
    if (this.isExpired(user)) {
      throw new UnauthorizedException();
    }

    return user;
  }

  private isExpired(user: JwtUserDto): boolean {
    // ...
  }
}

此代码检查“auth”-cookie 或“授权”-header 中的 jwt 令牌,并通过返回用户,将解码后的用户(如果有效)附加到请求。

要使用它:export class JwtAuthGuard extends AuthGuard('custom-jwt')

这只是一个例子,看看它是如何工作的。您可能需要对其进行调整以满足您的需要。