【问题标题】:How can we access decorator from a service class in NestJS我们如何从 NestJS 中的服务类访问装饰器
【发布时间】:2021-06-08 23:51:41
【问题描述】:

我是 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 的东西,所以我不需要服务类的方法 :)

我正在向您寻求更好的解决方案:)

谢谢。

【问题讨论】:

    标签: authorization nestjs nestjs-jwt


    【解决方案1】:

    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('/');
      }
    }
    

    【讨论】:

    • 但是假设我想从某些类中获取用户,我该如何获取呢?
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多