Несколько локальных стратегий не работают в PassportStrategy
Я работаю с фреймворком NestJS. у меня естьLocalStrategy
для аутентификации пользователей. Теперь я хочу еще одну LocalStrategy с именемMylocalStrategy
. Для этого я добавляю два файла: mylocal.strategy.ts и mylocal-auth.guard.ts.
Вот мой mylocal-auth.guard.ts
содержание:
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class MylocalAuthGuard extends AuthGuard('mylocal') {}
Но когда я использую @UseGuards(MylocalAuthGuard)
Я получаю сообщение об ошибке: "Неизвестная стратегия аутентификации" mylocal "".
В чем может быть проблема?
1 ответ
Вы должны назвать свои стратегии и зарегистрироваться в провайдере. Для меня это работает со следующей настройкой
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalAuthGuard extends AuthGuard('UsernamePasswordStrategy') {}
@Injectable()
export class OTPAuthGuard extends AuthGuard('OTPStrategy') {}
Стратегия имени пользователя и пароля
import { Strategy } from 'passport-local';
@Injectable()
export class LocalStrategy extends PassportStrategy(
Strategy,
'UsernamePasswordStrategy',
) {
constructor(
@Inject(IAuthService)
private readonly authService: IAuthService,
) {
super({
usernameField: 'user_name',
passwordField: 'password',
});
}
async validate(user_name: string, password: string): Promise<any> {
const loginDto = new LoginDto();
loginDto.userName = user_name;
loginDto.password = password;
const user: UserDto = await this.authService.validateUser(loginDto);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
OTP-стратегия
import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Inject, Injectable, UnauthorizedException } from '@nestjs/common';
import { IAuthService } from '../services';
import { OtpLoginDto } from '../dto';
import { UserDto } from 'src/modules/user/dto';
import { plainToClass } from 'class-transformer';
@Injectable()
export class OTPStrategy extends PassportStrategy(Strategy, 'OTPStrategy') {
constructor(
@Inject(IAuthService)
private readonly authService: IAuthService,
) {
super({
usernameField: 'phone',
passwordField: 'otp',
});
}
async validate(phone: string, otp: string): Promise<any> {
const loginDto = plainToClass(OtpLoginDto, {
phone: phone,
otp: otp,
});
const user: UserDto = await this.authService.verifyOtp(loginDto);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}