Какую проверку подлинности с использованием Auth API мы должны выполнить в наших Angular Authentication Guards? - PullRequest
0 голосов
/ 27 февраля 2020

В этой статье автор использует Auth.currentAuthenticatedUser() в AuthGuard следующим образом:

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return Auth.currentAuthenticatedUser().then(() => { return true; })
      .catch(() => {
        this.router.navigate(['signin']);
        return false;
      });
  }

Однако , как отмечено в этом выпуске , это может привести к даже если использование аутентифицировано и было перенаправлено, что приводит к двум перенаправлениям. Первый от Cognito, а второй от Auth Guard, так как он не «думает», что пользователь уже вошел в систему.

Так что мы должны вызывать на Auth, который гарантирует, что не будет выбрасывать, когда пользователь вошел в систему через федеративные удостоверения?

Я думаю, что Auth.currentSession() будет работать, но хотел перепроверить.

Обновление

Я пытался Auth.currentSession(), но это также не не предоставлять сеанс сразу после перенаправления.

Это то, что я пробовал в AppComponent:

    Auth.currentSession().
      then((s) => console.log(`The current session is ${JSON.stringify(s)}`)).
      catch((e) => console.log(`There is no current session ${e}`))



После перенаправления при загрузке приложения это то, что регистрируется:

There is no current session No current user

Если я обновлюсь вручную, он запишет сеанс так, как мы ожидаем.

1 Ответ

0 голосов
/ 28 февраля 2020

В целом, мы, вероятно, не предполагаем, что аутентифицированный пользователь будет доступен сразу после перенаправления Cognito.

Поскольку мы не можем этого сделать, мы также не можем перенаправить на защищенный ресурс, поскольку охранник запрещает access.

Поэтому мы должны перенаправить на незащищенную страницу, а затем ждать, пока Amplify сообщит нам, что аутентификация прошла.

Затем мы можем использовать субъект для уведомления других частей приложение.

Похоже, что правильный способ прослушивания (пока AngularService не поддерживает Angular 9) - это запускать одновременно и Auth.currentAuthenticatedUser(), и Hub.listen.

Сразу после редирект Auth.currentAuthenticatedUser(), скорее всего, сгенерирует, но Hub.listen в конечном итоге сгенерирует событие входа, которое мы можем затем выполнить на нашем предмете.

Так что попробуйте Auth.currentAuthenticatedUser(), и если он сгенерирует, то попытайтесь прослушать sigin событие с Hub в блоке catch. Также слушайте signout событий в этом случае.

После этого, пока пользователь не выйдет из системы или не истечет время сеанса, Auth.currentAuthenticatedUser() всегда должен вернуть пользователя, и мы можем затем, что по теме, которой мы являемся использовать для наблюдения за аутентифицированным состоянием.

Вот так я планирую подойти к нему.

...