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