Я хотел бы добавить аутентификацию для компонента посадки.Я изо всех сил пытаюсь понять поток между auth guard и auth service.Моя служба аутентификации выполняет http-запрос к моему серверу, чтобы проверить, вошел ли пользователь в систему. Пока я превращаю этот запрос в субъект поведения, он всегда отправляет начальное значение false для сторожевого устройства.Как создать тему воспроизведения, чтобы справиться с этим?У меня есть некоторый код, составленный из множества поисковиков, но я не уверен, как он работает, или это правильно.
Я пробовал тему поведения.Только возвращающие логические значения из canActivate.
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) { }
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isLoggedIn()
.pipe(
map(x => { if (!x) return false } ),
catchError => Observable.create(false)
);
}
}
Прошу прощения за любые ужасы, я нахожу библиотеку rxjs трудной для изучения.
export class AuthService {
private authenticatedUser;
constructor(private http: HttpClient) { }
isLoggedIn(): Observable<boolean> {
let subject = new ReplaySubject<boolean>();
if (!this.authenticatedUser) {
this.http.get('/api/current_user').subscribe(res => {
console.log("next: returning true");
this.authenticatedUser = res;
subject.next(true);
}, (err) => {
console.error("next: returning false");
subject.next(false);
});
}
return subject.asObservable()
}
}
Я не использую локальное хранилище.Многие из примеров, которые я вижу, используют это.Конечно, это здорово, потому что это синхронное действие.Мой поток должен начинаться с запроса к моему серверу.
Есть мысли или указатели?Каким должен быть поток?Является ли тема воспроизведения лучшим подходом?В любом случае, я мог бы хранить там объект User?
любая помощь очень ценится,