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 作为到期日期,即使他们都同时过期。
什么会导致特定用户的本地存储被清除,而其余用户不受影响?是他们的防火墙吗?是他们的抗病毒软件吗?浏览器?浏览器版本?
如有任何帮助,我们将不胜感激。
申请- 我有一个需要登录的网站。某些路由要求用户收到令牌(来自登录步骤),否则他们将被重定向到登录页面。
运行下-
两个用户挺身而出并提到他们无法登录。经过一些故障排除和查看日志后,我发现他们成功登录了。所以我与一个用户共享了屏幕,并在开发人员中查看了 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 作为到期日期,即使他们都同时过期。