如何解决我们如何从 NestJS 中的服务类访问装饰器
我是 nestJS 的新手,正在尝试进行身份验证系统。我能够做到。所以这就是我为了访问身份验证所做的事情。
在我的控制器中我有
@Get('/user')
async getUser(@AuthUser() token: string) : Promise<Object> {
return this.authService.getUser(token)
return token
}
这里我传递了一个 AuthUser
装饰器,我想避免传入控制器。
在 authService.getUser
方法中,我有这样的事情
async getUser(token: string): Promise<Object> {
try {
const user = await this.jwtService.verifyAsync(token)
return user
} catch (error) {
return false
}
}
我的装饰器看起来像这样
import { createParamDecorator,ExecutionContext } from '@nestjs/common';
export const AuthUser = createParamDecorator(
(data = 'u_ses',ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return data ? request.cookies?.[data] : request.cookies;
},);
我不喜欢代码。如果我需要从服务类或任何地方知道用户 ID,我需要传递令牌并获取令牌,我需要使用 @AuthUser() token: string)
所以我想做这样的事情
this.authService.getUser()
,在这里我不想传递令牌或任何东西,应该能够从任何地方访问这个 getUser
方法。由于它是一个服务类,我可以注入和使用它,但我没有令牌。
我尝试在服务类中注入装饰器,但这不起作用。
我更喜欢的一个最好的解决方案是在装饰器中使用 JWT 的东西,所以我不需要服务类的方法:)
我正在向您寻求更好的解决方案 :)
谢谢。
解决方法
Nestjs 有 NestMiddleware
。在这里,您可以像这样在访问控制器之前进行授权:
import { Injectable,NestMiddleware,UnauthorizedException } from '@nestjs/common';
import { Request,Response,NextFunction } from 'express';
@Injectable()
export class AuthenticationMiddleware implements NestMiddleware {
use(req: Request,res: Response,next: NextFunction) {
const headerAuthentication = req.headers.authorization;
if(!headerAuthentication) throw new UnauthorizedException('Authorization failed!');
const token = req.headers.authorization.split(' ')[1];
if(token) {
next();
}else {
throw new UnauthorizedException('Authorization failed!');
}
}
}
并在 AppModule
中实现它
configure(consumer: MiddlewareConsumer) {
consumer.apply(AuthenticationMiddleware).forRoutes('/');
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。