Несколько локальных стратегий не работают в 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;
  }
}
Другие вопросы по тегам