Аутентификация NestJS по паспорту JWT не работает - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь настроить очень простую систему входа в систему, используя jwt-passport с nestjs.Я следовал этому уроку: https://docs.nestjs.com/techniques/authentication, но я просто не могу заставить его работать.Я действительно новичок в этом деле и буду признателен, если кто-нибудь покажет мне путь.

Способ отправки логина на сервер:

    this.clientAuthService.login(this.userName, this.password).then(response => {
        this.clientAuthService.setToken(response.access_token);
        this.router.navigate(['/backend']);
    });

Мой ClientAuthService:

export class ClientAuthService {

  constructor(private http: HttpClient, @Inject(PLATFORM_ID) private platformId) {
  }

  getToken(): string {
    if (isPlatformBrowser(this.platformId)) {
      return localStorage.getItem(TOKEN_NAME);
    } else {
      return '';
    }
  }

  setToken(token: string): void {
    if (isPlatformBrowser(this.platformId)) {
      localStorage.setItem(TOKEN_NAME, token);
    }
  }

  removeToken() {
    if (isPlatformBrowser(this.platformId)) {
      localStorage.removeItem(TOKEN_NAME);
    }
  }

  getTokenExpirationDate(token: string): Date {
    const decoded = jwt_decode(token);

    if (decoded.exp === undefined) {
      return null;
    }

    const date = new Date(0);
    date.setUTCSeconds(decoded.exp);
    return date;
  }

  isTokenExpired(token?: string): boolean {
    if (!token) {
      token = this.getToken();
    }
    if (!token) {
      return true;
    }

    const date = this.getTokenExpirationDate(token);
    if (date === undefined) {
      return false;
    }
    return !(date.valueOf() > new Date().valueOf());
  }

  login(userName: string, password: string): Promise<any> {
    const loginData = {username: userName, password};
    return this.http
      .post(Constants.hdaApiUrl + 'user/login', loginData, {headers: new HttpHeaders({'Content-Type': 'application/json'})})
      .toPromise();
  }

}

Мой user.controller.ts

@Controller('user')
export class UserController {

  constructor(private readonly authService: AuthService) {
  }

  @UseGuards(AuthGuard('local'))
  @Post('login')
  authenticate(@Request() req) {
    return this.authService.login(req);
  }

}

Мой user.service.ts

export class UsersService {
  private readonly users: User[];

  constructor() {
    this.users = [
      {
        userId: 1,
        username: 'test',
        password: '12345',
      }
    ];
  }

  async findOne(username: string): Promise<User | undefined> {
    return this.users.find(user => user.username === username);
  }
}

Тогда у меня есть jwt.strategy.ts

export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: Constants.jwtSecret,
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username };
  }
}

и local.strategy.ts

export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly authService: AuthService) {
    super();
  }

  async validate(username: string, password: string): Promise<any> {
    const user = await this.authService.validateUser(username, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

В основном я просто следовал учебному пособию и сам добавил кое-что для клиентской части.Я пропустил часть с UseGuard('local') для маршрута входа в систему, но после добавления я получаю ошибку 401 всегда.Когда я не использую UseGuard('local'), не имеет значения, что я печатаю в форме входа.После того, как я отправляю детали, я получаю доступ к бэкэнду, даже если он не был корректным.

Также стоит упомянуть, что методы validate в jwt.strategy.ts и local.strategy.tsпомечен как not used в WebStorm.

Я знаю, что здесь много кода, но мне нужна помощь, потому что я не могу найти другие источники для конфигурации аутентификации NestJS, которая актуальна.Такое ощущение, что учебник, которому я следовал, пропустил много шагов для начинающих.

1 Ответ

1 голос
/ 26 сентября 2019

Убедитесь, что ваше тело сообщения (полезная нагрузка) совпадает с подписью метода validate (на самом деле это должны быть имя пользователя и пароль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...