我使用带有 jwt 策略的带有护照的nestjs。我想在我的一些请求中获得当前用户。目前,我有一个看起来像这样的装饰器:
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.user 在每个(或至少在一些不是 AuthGuard 的请求)上,通过应用护照中间件来表达真的很直接,但我不知道该怎么做它与@nestjs/passport。
[编辑] 感谢 vpdiongzon 为我指明了正确的方向,我根据他的回答选择了一个守卫,它只是用 user 或 null 填充 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 };
}