node.js - چگونه لایه خدمات خود را به Auth Guard تزریق کنم؟ NestJS - AuthGuards


من در حال ایجاد یک سیستم احراز هویت از طریق UseGuards هستم، اما چگونه میتوانم وابستگیها را به گاردهای خود تزریق کنم؟ دوست دارم این کار را به صورت جهانی انجام دهم تا از تکرار کد و وارد کردن وابستگیها در هر کنترلر جلوگیری کنم.

من از حالت وارونگی وابستگی استفاده میکنم و کلاسها را تزریق میکنم، همچنین کلاسها را فقط به پیادهسازیها و قوانین رابط وابسته میکنم...

خدمات احراز هویت من

export class AuthServices implements IMiddlewareAuth {
  constructor(
    private readonly jwt: IJWTDecrypt,
    private readonly authUserRepo: IAuthUserContract,
  ) {}

  public async intercept(
    req: IMiddlewareAuth.Attrs,
  ): Promise<IMiddlewareAuth.Return> {
    const token = req.headers['Authorization'];

    if (!token) {
      new Fails('Access denied', 403);
    }

    const parts = token.split(' ');
    if (parts.length !== 2) {
      return new Fails('Anauthorized', 401);
    }

    const [scheme, access] = parts;
    if (!/^Bearer$/i.test(scheme)) {
      return new Fails('Anauthorized', 400);
    }

    const id = await this.jwt.decrypt(access);
    if (!id) {
      return new Fails('Anauthorized', 400);
    }

    const user = await this.authUserRepo.findById(id);
    if (!user) {
      return new Fails('Anauthorized', 400);
    }

    return user;
  }
}

نگهبانهای احراز هویت من

@Injectable()
export class AuthorizationGuard implements CanActivate {
  constructor(
    @Inject('AuthServices')
    private authServices: IMiddlewareAuth,
  ) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();

    const user = await this.authServices.intercept(request);
    if (user instanceof Fails) {
      throw new HttpException(
        {
          statusCode: user.statusCode,
          error: user.message,
        },
        user.statusCode,
      );
    }

    request.user = {
      email: user.email,
      id: user.id,
      name: user.name,
    } as ISessionLogin;

    return true;
  }
}

ماژول احراز هویت من

@Module({
  imports: [ConfigModule.forRoot(), TypeOrmModule.forFeature([UserEntity])],
  providers: [
    {
      provide: AuthUserRepository,
      useFactory: (dataSource: DataSource) => {
        return new AuthUserRepository(
          dataSource.getMongoRepository(UserEntity),
        );
      },
      inject: [getDataSourceToken()],
    },
    {
      provide: JsonWebToken,
      useFactory: () => {
        return new JsonWebToken();
      },
    },
    {
      provide: AuthServices,
      useFactory: (
        jwt: JsonWebToken,
        authUserRepository: AuthUserRepository,
      ) => {
        return new AuthServices(jwt, authUserRepository);
      },
      inject: [JsonWebToken, AuthUserRepository],
    },
  ],
  exports: [AuthServices],
})
export class AuthModule {}

خطا

پاسخ شماره ۱

به جای @Inject('AuthService') از @Inject(AuthService) استفاده کنید. تمایز مهم این است که 'AuthService' یک نشانه رشتهای است که با AuthService.name مطابقت دارد و AuthService یک ارجاع کلاس است. همچنین، مطمئن شوید که CreateUsersModule دارای AuthModule در آرایه imports خود باشد.