У меня есть KeysModule, который можно использовать для добавления или удаления ключей API.Мне нужны эти ключи для защиты некоторых маршрутов от несанкционированного доступа.Чтобы защитить эти маршруты, я создал ApiGuard:
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiGuard implements CanActivate {
async canActivate(
context: ExecutionContext,
): Promise<boolean> {
const request = context.switchToHttp().getRequest();
return request.headers.api_key;
}
}
И затем я использую его в маршруте:
@Get('/protected')
@UseGuards(ApiGuard)
async protected(@Headers() headers: Api) {
const key = await this.ks.findKey({ key: headers.api_key });
if (!key || !key.active) return 'Invalid Key';
return 'Your API key works';
}
Где ks - это KeyService, используемый для проверки правильности ключа или нет.Это решение работает, но глупо.Я должен копировать и вставлять некоторые строки кода везде, где я хочу использовать эту защиту (я имею в виду строки в маршруте).
Я попытался переместить всю логику в ApiGuard, но там у меня есть ошибка, чтоKeyService нельзя внедрить в класс ApiGuard.Чтобы объяснить, у меня есть KeyService в провайдерах в KeysModule, но ApiGuard используется во всем мире.
У вас есть идеи, как это сделать?