Я использую гнездо js с паспортом со стратегией jwt. И я хочу получить текущего пользователя по некоторым из моих запросов. В настоящее время у меня есть декоратор, который выглядит так:
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const CurrentUser = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const user = ctx.switchToHttp().getRequest().user;
if (!user) {
return null;
}
return data ? user[data] : user; // extract a specific property only if specified or get a user object
},
);
Он работает как задумано, когда я использую его на маршруте с AuthGuard:
@Get('test')
@UseGuards(AuthGuard())
testRoute(@CurrentUser() user: User) {
console.log('Current User: ', user);
return { user };
}
Но как мне заставить его работать (получить текущего пользователя) на неохраняемых маршрутах? Мне нужно, чтобы пользователи могли публиковать свои комментарии независимо от того, авторизованы они или нет, однако, когда они вошли в систему, мне нужно узнать их имя.
В основном, мне нужен способ распространить req. пользователь для каждого (или, по крайней мере, для некоторых запросов, не связанных с AuthGuard), это действительно просто сделать в express, применив промежуточное ПО для паспорта, но я не уверен, как это сделать с помощью @ nestjs / паспорт.
[РЕДАКТИРОВАТЬ] Благодаря vpdiongzon за то, что он указал мне в правильном направлении, я решил создать охрану на основе его ответа, который просто заполняет req.user либо пользователем, либо нулем:
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class ApplyUser extends AuthGuard('jwt') {
handleRequest(err: any, user: any) {
if (user) return user;
return null;
}
}
И теперь я мог бы просто использовать его на любом незащищенном маршруте, который должен получить текущего пользователя
@Get('me')
@UseGuards(ApplyUser)
me(@CurrentUser() user: User) {
return { user };
}