小编Rya*_* Ro的帖子

PassportJS、NestJS:AuthGuard('jwt') 的 canActivate 方法

有谁知道我在哪里可以看到 AuthGuard('jwt') 中 canActivate 方法的完整代码?我意识到 canActivate 方法通过使用 console.log() 调用 JwtStrategy 验证方法,如下所示:

// jwt.strategy.ts

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
    private readonly configService: ConfigService,
    private readonly usersService: UsersService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: true,
      secretOrKey: configService.get<string>('JWT_SECRET'),
    });
  }

  async validate(payload: any) {
    try {
      const user = await this.usersService.getUserById(payload.id);
      // console.log is here
      console.log(user);
      return user;
    } catch (e) {
      console.log(e);
      return null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用原始的 canActivate 方法,则会调用 console.log 。我认为 JwtStrategy 是一个中间件,因此只要有请求就会调用 validate 方法。但是,当我尝试重写 canActivate 方法来添加授权时,不会调用 JwtStrategy …

passport.js nestjs passport-jwt nestjs-passport nestjs-jwt

9
推荐指数
1
解决办法
8107
查看次数

NestJS AuthGuard 可处理 GraphQL 和 REST

根据文档,为了使用 AuthGuard 进行 GraphQL 解析器的身份验证,我们必须重写getRequest如下方法:

  getRequest(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    return ctx.getContext().req;
  }
Run Code Online (Sandbox Code Playgroud)

我的大多数 API 使用 GraphQL,但其他 API 使用 REST 端点来处理文件上传。(我提到了这个)现在,我正在使用两个 AuthGuard。一种是针对 GraphQL,我getRequest像上面一样重写了它。另一种是针对 REST 的,其代码完全相同,除了(这次我没有覆盖它)以及调用后从请求中getRequest提取对象的方式。usercanActivate

图形语言:

// getRequest is overridden
const user: User = this.getRequest(context).user;
Run Code Online (Sandbox Code Playgroud)

休息:

// getRequest is NOT overridden
const { user } = context.switchToHttp().getRequest();
Run Code Online (Sandbox Code Playgroud)

有什么方法可以尝试将这两个 AuthGuard 合二为一吗?

rest graphql auth-guard nestjs

1
推荐指数
1
解决办法
1353
查看次数