【问题标题】:What authentication check using the Auth API should we perform in our Angular Authentication Guards?我们应该在 Angular Authentication Guards 中使用 Auth API 执行什么身份验证检查?
【发布时间】:2020-06-11 16:17:00
【问题描述】:

In this article作者在AuthGuard中使用Auth.currentAuthenticatedUser()是这样的:

  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;
      });
  }

但是 as noted in this issue 即使使用已通过身份验证并已被重定向,这也会抛出,从而导致两次重定向。第一个来自 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

如果我手动刷新,它会按照我们的预期记录会话。

【问题讨论】:

  • 首先,我会避免在警卫中这样做:this.router.navigate(['signin'])。返回UrlTree 是这里的预期用途(在我看来)。

标签: javascript angular amazon-web-services amazon-cognito aws-amplify


【解决方案1】:

一般来说,我们可能不会假设经过身份验证的用户将在 Cognito 重定向后立即可用。

由于我们不能这样做,我们也不能重定向到受保护的资源,因为守卫拒绝访问。

因此我们必须重定向到一个非受保护的页面,然后等待 Amplify 告诉我们已经进行了身份验证。

然后我们可以使用 Subject 来通知应用程序的其他部分。

似乎正确的监听方式(在 AngularService 支持 Angular 9 之前)是同时运行 Auth.currentAuthenticatedUser() 和 Hub.listen。

在重定向之后Auth.currentAuthenticatedUser() 很可能会抛出,但 Hub.listen 最终会发出登录事件,我们可以在主题上进行下一步。

所以尝试Auth.currentAuthenticatedUser(),如果它抛出,然后尝试在catch 块中使用Hub 侦听sigin 事件。在这种情况下还要监听signout 事件。

在那之后直到用户退出或会话超时,Auth.currentAuthenticatedUser() 应该总是返回一个用户,然后我们可以在我们用来观察身份验证状态的主题上进行下一步。

所以我打算这样处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2019-02-09
    • 1970-01-01
    • 2018-10-09
    • 2021-07-24
    相关资源
    最近更新 更多