【问题标题】:How to use passport in nestjs middleware?如何在nestjs中间件中使用护照?
【发布时间】:2018-08-07 07:32:18
【问题描述】:

我正在尝试编写身份验证中间件。问题是每次我尝试做某事时我的设置都会抛出“未经身份验证”。

我的中间件:

@Middleware()
export class AuthMiddleware implements NestMiddleware {
  constructor(
    @Inject(constants.logger) private logger: Winston,
  ){}

  resolve(...args: any[]): ExpressMiddleware {
    return passport.authenticate('jwt', { session: false });
  }
}

JwtStrategy 类:

@Component()
export class JwtStrategy extends Strategy {
  constructor(
    private readonly authService: AuthService,
    @Inject(constants.config) private readonly config: Config,
  ) {
    super(
      {
        jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
        passReqToCallback: true,
        secretOrKey: config.JWT_SECRET,
      },
      async (req, payload, next) => {
        console.log('hello from verifycb');
        next(null, payload);
      },
    );
    passport.use('jwt', this);
  }

  public async verify(req, payload: TokenData, done) {
    console.log('JwtStrategy::verify(req, payload)', {req, payload});
    const isValid = await this.authService.isUserValid(payload);
    if (!isValid) {
      return done('Unauthorized 22', false);
    }
    done(null, payload);
  }
}

我确定我的中间件调用了。我是以奇怪的方式使用它还是什么?

【问题讨论】:

  • 如果您找到解决方案,请发布答案!还没有多少 Nestjs 专家在 SO 上。
  • 还是没有解决办法,所以我放弃了

标签: node.js typescript nestjs


【解决方案1】:

可能有点晚了,但您需要在 Modules

中明确consume 中间件

// active.module.ts

@Module({
    ...
})
export class ActiveModule implements NestModule {
    public configure(consumer: MiddlewaresConsumer) {
        consumer.apply(JwtMiddleware).forRoutes(
            {path: '/api/lists/create', method: RequestMethod.POST}
        );
    }
}

在本例中,JwtMiddleware 是我的中间件,与您的 AuthMiddleware 相同。

//active.controller.ts

@Controller('lists')
export class ActiveController {
    @Post('create')
    async create(@Req() request: Request) {
         // req.user will be available for you
    }
}

【讨论】:

  • 那么你觉得这个框架怎么样?你喜欢和它一起工作吗?当我看到它时,这似乎很可怕(NgModule 是一个卑鄙的黑客,是在候选发布者之间用螺栓固定的东西,除了精心设计之外的任何东西),而且在我看来,它所陈述的存在理由并不令人信服。只是好奇,我知道这是题外话。
  • 目前,我喜欢使用它。该框架没有任何问题,但缺乏可以添加/请求的良好教程/文档/实现。我不确定我明白你的意思,但我喜欢它。在 Loopback4 出来之前,我坚持使用 NestJS。
  • 当我第一次开始尝试这个框架时,我想到了extra-overhead,但现在我喜欢它所采用的方法。需要注意的一点是,我也是 Angular 开发人员,所以我是该结构的粉丝;)
  • 我还开发了 Angular 应用程序,一个严格基于 Web 的应用程序和一个离子移动应用程序。我非常感谢您的回复。让我恼火的不是性能开销,而是抽象的复杂性,以及服务器冗余和可维护性负担,它的设计本身就是一个非冗余的模块概念,在另一个之上,棱角分明的概念很复杂,并且如其他通过其他框架,不必要的,这导致我非常不喜欢泛化它的想法。
  • 它不仅几乎从字面上复制了依赖图,而且同时证明它不适合工具,本质上是不透明的,并且以最空洞的类型表示(new<T>(...args) => T)[] 是接近无意义)。这种组织代码的机制是可恶的,并且在其上浪费了 JavaScript 和 TypeScript 的功能。从框架的历史中我们知道,这绝对是事后才想到的。
猜你喜欢
  • 2018-10-26
  • 2021-04-03
  • 1970-01-01
  • 2022-08-12
  • 2019-07-01
  • 2017-10-05
  • 2016-05-09
  • 2019-11-03
  • 2022-11-02
相关资源
最近更新 更多