Угловая гвардия и JWT
Я пытаюсь сделать следующее... У меня есть API, где я отправляю токен JWT POST, чтобы проверить, если он действителен / истек,
так что в моей службе углового входа у меня есть такой метод.
isUserlogged() {
return this.httpClient.get(`${this.URL}/verifyToken`, { headers: { 'authorization': localStorage.getItem('token') } })
}
эта подписка возвращает логическое значение, все в порядке здесь.
Теперь я реализую Guards в своем приложении, поэтому теперь я хочу использовать это логическое значение для моего метода canActivate, чтобы заблокировать доступ... Я прочитал, что мне нужно вернуть, true или false в этом методе, чтобы разрешить или заблокировать доступ к маршруты, которые я настроил раньше
Так что я делаю что-то вроде этого внутри canActivate.
this.loginService.isUserlogged().subscribe((response: boolean)=>{
if(response){
return true;
}
return false;
});
но это возвращается пустота... почему? Как я могу получить истинное или ложное значение из этой подписки?
1 ответ
Не возвращайте подписку изнутри маршрута охраннику. Если не логическое значение, то возвращайте наблюдаемое логического значения.
return this.loginService.isUserlogged()
Так как isUserlogged уже дает вам логический вывод, вы можете напрямую вернуть Observable.
Если isUserlogged()
не возвращает логическое значение, а затем передать его.
return this.loginService.isUserlogged().pipe(
map((resp) => {
// some logic here, check the return.
// based on the logic
if (something) {
return true
}
return false
})
)
Это все будет работать, если ваш API
вызов завершается и возвращается правильный ответ. Если ваш API возвращает void, то вы не предоставили никаких подробностей относительно вашего вызова API, и ваш API работает. (Сначала протестируйте свой API с помощью HTTP-клиента, например: Почтальон, если он дает правильный ответ, затем интегрируйте его с Angular)
Мои решения, метод обещания и здоровый бегун.
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.mailVerifyControl()
.then(() => {
return true;
})
.catch((err) => {
return false;
});
}
mailVerifyControl(): Promise<boolean> {
return new Promise((resolve, reject) => {
if (this.authService.isMailVerified === true) {
reject()
}
resolve();
});
}