0

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

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

谢谢你。

4

1 回答 1

0

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-03-11T12:16:02.680 回答