我有KeysModule,可以用来添加或删除API key。我需要这些密钥来保护一些路由,防止未经授权的访问。为了保护这些路由,我创建了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类中。为了解释,我在KeysModule中使用了KeyService提供程序,但ApiGuard是全局使用的。
你知道怎么做吗?
发布于 2019-03-05 03:18:34
也许太晚了,但我运行了同样的问题并找到了解决方案。也许有一个更好的方法,但它对我来说工作正常:
将KeysModule定义为全局模块,可以在https://docs.nestjs.com/modules文档中查看如何实现
在您可以这样做之后:
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiGuard implements CanActivate {
constructor(
@Inject('KeyService')
private readonly ks
) {}
const key = await this.ks.findKey();
"YOUR_CODE_HERE..."
}
希望这对你或将来坚持这样做的人有帮助。
发布于 2021-08-26 11:56:12
从NestJS v8开始,注入zsoca在公认答案中回答的服务似乎不再起作用。
NestJS 8的工作解决方案是通过提供类引用而不是字符串:
constructor(@Inject(KeyService) private keyService: KeyService) {}
发布于 2021-02-25 01:35:09
卫士中使用的服务必须在其模块中导出。仅仅提供服务是不够的!
https://stackoverflow.com/questions/52862644
复制相似问题