Как мы можем получить доступ к декоратору из класса обслуживания в NestJS

Я новичок в NestJS и пытаюсь создать систему аутентификации. Я смог сделать. Итак, вот что я делаю, чтобы получить доступ к auth.

В моем контроллере у меня есть

      @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;
},
);

Я не люблю код. Если мне нужно узнать идентификатор пользователя из класса обслуживания или где-либо еще, мне нужно будет передать токен, и чтобы получить токен, мне нужно использовать @AuthUser() token: string)

Итак, я хочу сделать что-то вроде этого

this.authService.getUser(), здесь я не хочу передавать токен или что-то еще и должен иметь доступ к этому getUserметод из любого места. Поскольку это класс обслуживания, я могу вводить и использовать его, но у меня не будет токена.

Я попытался внедрить декоратор внутри класса обслуживания, но это не сработало.

Лучшее решение, которое я бы предпочел, - использовать 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('/');
  }
}
Другие вопросы по тегам