提问人:Thiago Dias 提问时间:11/8/2023 更新时间:11/8/2023 访问量:20
Passport local 策略附加验证返回到 nestJS 中的@Body
Passport local strategy attach validate return to @Body in nestJS
问:
基本上,我有一个嵌套应用程序,并按照文档使用 passport 实现了 auth 模块。在那之后,我一直在做一些重构,添加类型等。
我在整个代码库中遵循的约定之一是,控制器端点将指定它们在请求正文中接收的内容。例如。async createUser(@Body() createUserDto: CreateUserDto)
本地策略登录的文档终结点正好如下:
@UseGuards(AuthGuard('local'))
@Post('auth/login')
async login(@Request() req) {
return req.user;
}
我想从使用装饰器更改为使用装饰器。但是,我无法找到如何更改以将用户内容返回到指定参数。@Request()
@Body()
AuthGuard('local')
@Body()
我尝试在authModule中添加配置,例如。property
PassportModule.register({
property: 'signInDto',
}),
但它仍然没有奏效。有没有办法实现这一点,最好是使用默认护照本地警卫?如果没有,我怎样才能实现所需的功能?
答:
0赞
Nmeer Naji
11/8/2023
#1
我不知道我是否正确理解了你。
您希望在收到的请求的正文中返回用户。
但是,我无法找到如何更改 AuthGuard('local') 以将用户内容返回到 @Body() 指定的参数。
如果是这样,那么你不应该这样做:请求的正文是 API 用户发送给你的内容。
例如,在登录请求中,用户向您发送其帐户的电子邮件和密码,然后从该信息中检查用户是否存在,如果存在,则获取其帐户。
您可以像这样在同一个请求中使用 @Request 和 @Body。
@UseGuards(AuthGuard('local'))
@Post('auth/login')
async login(@Request() req, @Body() createUserDto: CreateUserDto) {
return doSomething(req.user);
}
如果根据验证码的正文数据有效,本地守卫将返回用户实例。
评论
0赞
Thiago Dias
11/8/2023
这个想法是完全避免使用 @Request()。虽然可以直接使用请求,但我认为它不是很有描述性,而且它偏离了代码库中遵循的当前模式。理想情况下,我将能够执行以下操作:.async signin(@Body() signInDto: SignInDto)
0赞
Nmeer Naji
11/8/2023
我不认为您可以在没有请求实例的情况下获取已登录的用户,您需要它,因为您正在将已验证的用户实例注入其中,如果您可以在不使用可以帮助您@Request的情况下获取请求实例,否则,您需要请求实例来获取已验证的用户。
0赞
Thiago Dias
11/8/2023
这正是我的问题,是否有可能在不必使用 @Request() 的情况下获得它,如果是,如何去做
0赞
Nmeer Naji
11/9/2023
您可以创建一个请求范围的服务(请参阅此内容),然后只需将请求实例注入其中,如下所示:import { Injectable, Scope, Inject } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { Request } from 'express'; @Injectable({ scope: Scope.REQUEST }) export class CatsService { constructor(@Inject(REQUEST) private request: Request) {} }
评论