gpt4 book ai didi

NestJS 和 passport-local : AuthGuard ('local' ) validate() never get called

转载 作者:行者123 更新时间:2023-12-05 02:33:42 25 4
gpt4 key购买 nike

我已经一步步按照官方 Nest 文档 ( https://docs.nestjs.com/security/authentication ) 进行操作,但是在登录操作中使用 @AuthGuard('local') 或 @AuthGuard(LocalAuthGuard) 时无法调用 validate() 方法。

如果我不使用那个守卫装饰器,一切都会按预期工作(但我需要使用它来将我的 token 添加到请求对象)。

auth.controller.ts

  @UseGuards(AuthGuard('local')) // or AuthGuard(LocalAuthGuard)
@Post('login')
async login(
@Request() req
) {
const { access_token } = await this.authService.login(req.user);
return access_token;
}
}

local.strategy.ts

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super({ usernameField: 'email' });
}

async validate(email: string, password: string): Promise<any> { // class is constructed but this method is never called
const user: UserDto = await this.authService.login({
email,
password,
});

if (!user) {
throw new UnauthorizedException();
}
return user;
}
}

auth.module.ts

@Module({
imports: [
UsersModule,
PassportModule,
JwtModule.register({
secret: "bidon",
signOptions: {
expiresIn: '3600',
},
}),
],
providers: [AuthService, LocalStrategy, JwtStrategy],
exports: [AuthService, PassportModule, JwtModule],
controllers: [AuthController],
})
export class AuthModule {}

PS:我已经阅读了所有与堆栈溢出相关的帖子(例如:NestJS' Passport Local Strategy "validate" method never called),但它们对我没有帮助。

最佳答案

我发现如果我们不传递emailpassword,而且两者的值都是错误的,守卫会回复Unauthorized信息.问题是如果未定义,如何确保在运行守卫逻辑之前对必填字段进行验证,换句话说,前端不会将其传递给服务器。如果我们在 Controller 方法中添加 @Body() data: loginDto,它不会验证 body 参数。

为了解决这个问题,我在 local.guard.ts 文件中添加了一些验证代码。这是我项目中的代码:

import { HttpException, HttpStatus, Injectable, UnauthorizedException } from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";

@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {
handleRequest(err, user, info, context, status) {
const request = context.switchToHttp().getRequest();
const { mobile, password } = request.body;
if (err || !user) {
if (!mobile) {
throw new HttpException({ message: '手机号不能为空' }, HttpStatus.OK);
} else if (!password) {
throw new HttpException({ message: '密码不能为空' }, HttpStatus.OK);
} else {
throw err || new UnauthorizedException();
}
}
return user;
}
}

关于NestJS 和 passport-local : AuthGuard ('local' ) validate() never get called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70896560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com