Как мы можем получить доступ к декоратору из класса обслуживания в 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-элементы внутри декоратора, поэтому мне не нужен метод класса обслуживания :)

Я ищу от вас более приятные решения :)

Спасибо.


person Hkm Sadek    schedule 11.03.2021    source источник


Ответы (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('/');
  }
}
person danhuong    schedule 11.03.2021
comment
но допустим, я хочу получить пользователя из некоторых классов, как мне это получить? - person Hkm Sadek; 11.03.2021