select 用户的本地存储清除

Local storage clearing for select users

什么会导致特定用户的本地存储被清除,而其余用户不受影响?是他们的防火墙吗?是他们的抗病毒软件吗?浏览器?浏览器版本?

如有任何帮助,我们将不胜感激。

申请- 我有一个需要登录的网站。某些路由要求用户收到令牌(来自登录步骤),否则他们将被重定向到登录页面。

运行下-

两个用户挺身而出并提到他们无法登录。经过一些故障排除和查看日志后,我发现他们成功登录了。所以我与一个用户共享了屏幕,并在开发人员中查看了 localstorage安慰。我看到他们成功获得了token。然后他们导航到 myorderCards 页面,令牌突然从存储中清除,他们被路由回登录页面。这然后将它们置于循环中,因为每次他们成功登录时我都有一个 return 参数将它们发送回 myorderCards,然后清除令牌等...

所以我面临的问题是我无法重现这个问题。我已经在本地和已发布的站点上进行了测试。我已经在网络上和网络外进行了测试。我已经测试了 3 种不同的浏览器,甚至在 mac 设备上进行了测试(有问题的两个用户正在使用 macs)这个问题只发生在提交了票证的两个用户身上。我仍然无法弄清楚本地存储是如何清除的。唯一清除令牌的地方是您在下面看到的两行。

附加信息- 我已尝试更改我的浏览器设置以具有高安全性设置。但是,它继续为我工作。我已将浏览器设置更改为完全不允许 cookie,但这会破坏整个网站。

P.S 没有错误或异常。在服务器端或浏览器端。

app.module.ts

RouterModule.forRoot([
  { path: 'myorderCards/:id', component: MyOrderComponent,canActivate:[MyAuthGuard] },]),

在授权保护中class

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    const token = this.storage.getLocalStorageValue('mycurrentUser');
    if (token != null && Object.keys(token).length != 0) {
      const exTime = token.expires;
      if (new Date(exTime.toString()) > new Date(Date.now())) { 
        return true;
      }
      else { 
        this.storage.clearLocalStorage('mycurrentUser');
        this.router.navigate(["/mylogin"], { queryParams: { returnUrl: state.url } });
        return false;
      }
    }
    else { 
      this.storage.clearLocalStorage('mycurrentUser');
      this.router.navigate(["/mylogin"], { queryParams: { returnUrl: state.url } });
      return false;
    } 
  }

}

您的令牌的到期时间比较与时区无关。

问题是:如果您的令牌以某种方式包含不提供其时区假设的时间,例如 9/13/21 5:30 PM(或不基于 UTC 的纪元格式),那么它已经对比您早 1 小时的最终用户过期。等等

作为解决方案,您可以提供 UTC 格式的所有日期时间,甚至将其转换为 Unix 纪元,以阻止人们尝试在本地时间手动'read'它。

但对于 OAuth2,include 'expires in' 比 'expires at' 更常见。所以 OAuth2 访问令牌的主体通常是这样的:

{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create"
}

expires_in 是令牌的长度(秒)valid/alive。当客户端收到此令牌时,他们假设它从 'now' 开始过期(其中 'now' 是主观的,具体取决于地理位置)。所以他们自己计算到期时间 date/time 并存储它,这完全回避了时区转换的问题。

然后,对于同时进行身份验证的两个客户,纽约的一个可以存储 6:00 PM,而芝加哥的一个可以存储 5:00 PM 作为到期日期,即使他们都同时过期。