Как мне использовать Auth Guard с NGRX - PullRequest
0 голосов
/ 13 октября 2019

Я использую NGRX в приложении Angular, и я пытаюсь использовать Auth Guard. когда приложение запускается, я отправляю действие, которое получает статус авторизации с сервера (firebase). Проблема заключается в том, что, если я перейду непосредственно к ссылке, которая защищена средством проверки подлинности, по умолчанию состояние проверки подлинности равно false, поэтому оно возвращается и перенаправляется на страницу входа.

Вот мой метод canActivate

canActivate() {
        return this.store.select(fromAuth.getAuthenticatedStatus).pipe(
            //filter(isAuth => isAuth == true || isAuth == false),
            take(1),
            map((isAuth: boolean) => isAuth),
            catchError(() => of(false))
        )
    }

Есть ли способ подождать, пока состояние авторизации не вернется с сервера, прежде чем проверять хранилище на статус аутентификации? Я попытался отфильтровать и удалить оператор take, но, похоже, это не сработало.

Я не хочу помещать вызов на сервер в auth guard, потому что не хочупроверяйте сервер каждый раз, когда я переключаю страницы.

1 Ответ

1 голос
/ 13 октября 2019

Там у вас есть:

@Injectable()
export class LoggedGuard implements CanActivate {

    constructor(private auth: AngularFireAuth, private router: Router) { }

    canActivate() {
        return this.auth.authState.pipe(
            take(1),
            map(user => !!user), // !! convert User object to boolean value
            tap(isLogged => {
                if(!isLogged) {
                    this.router.navigate(['/login'])
                    console.log("You are not logged in. You cannot access route.")
                }
            })
        )
    }
}

В этой ситуации я предпочитаю сделать запрос в firebase, чтобы получить новый статус аутентификации, не принимая его из хранилища. Это более важно, если вы делаете защиту для кого-то с некоторыми утверждениями, потому что если вы удаляете одного администратора, у него могут быть все еще старые утверждения.

Firebase имеет свою собственную IndexedDB, если вы подключаете хранилище к некоторой «LocalDatabase» в браузереи по ошибке ваше приложение будет извлекать данные из локальной сети и не будет проверять наличие обновлений. Вы можете бесконечно войти в систему пользователя, даже если вы забаните его и удалите его учетную запись.

...