我知道网站上还有其他同名的问题,但我的上下文非常不同,所以我会问。
我目前有一个Turborepo这样的:
apps/api
packages/pkg/PkgModule
packages/pkg/auth/AuthModule
packages/pkg/auth/PkgAuthStrategy
packages/pkg/auth/PkgAuthGuard
PkgModule导入和重新导出PkgAuthModule,PkgAuthModule如下所示:
@Module({
imports: [ConfigModule, PkgAuthModule],
providers: [PkgService],
exports: [PkgService, PkgAuthModule]
})
export class PkgModule {}
PkgAuthModule看起来像这样
@Module({
imports: [PassportModule.register({ session: false }), ConfigModule],
providers: [PkgAuthStrategy, ConfigService],
exports: [PkgAuthStrategy]
})
export class PkgAuthModule {}
我的策略现在只是返回true。我的保护扩展AuthGuard('pkg-auth')
。我的问题是在我的auth保护中,当我使用this.reflector.getAllAndOverride<boolean>
时,reflector的计算结果为undefined。
验证防护:
@Injectable()
export class PkgAuthGuard extends AuthGuard('pkg-auth') {
constructor(private reflector: Reflector) {
super()
}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
console.log(this.reflector)
const isPublic = this.reflector.getAllAndOverride<boolean>('public', [
context.getHandler(),
context.getClass(),
])
if (isPublic) return true
return super.canActivate(context)
}
}
在API中,我只是简单地导入了pkgModule。当在api控制器中使用guard时,它不能正确地注入Reflector。
保护定义和用法如下:
export const Protected = () => UseGuards(PkgAuthGuard)
api.controller:
@Protected()
@Post('/<endpoint>')
public async endpoint(@Body() body: any) {
...
}
小背景:我有两个认证策略,Firebase和Pkg。PkgAuth用于验证Webhook推送器。Firebase由用户使用,运行良好。它们在设置中彼此相似,唯一显著的区别是PkgAuth在我的monorepo中是一个单独的包。
1条答案
按热度按时间7kqas0il1#
我发现
ConfigModule
也没有被注入,所以开始更积极地调查。结果,因为我的模块在一个单独的Turborepo包中,然后被我的Turborepo应用程序捆绑和使用,我需要再次定义所有Nestjs依赖项:$ yarn add @nestjs/common @nestjs/core reflect-metadata rxjs