有点奇怪。在我的 Angular 应用程序上,我有一种refreshUser
方法可以在显示所有屏幕数据之前加载可能登录的用户。为此,我有以下ngOnInit
方法:
async ngOnInit() {
await this.authService.refreshUser();
}
refreshUser 方法具有以下代码:
public refreshUser(): Promise<void> {
return this.manager.signinSilent()
.then(user => {
this.user = user;
})
.catch(e => {
console.log('User not logged in', e);
});
}
在全新的导航上,这很顺利,我得到了错误:
User not logged in ErrorResponse: login_required
at new e (main.2a53201b6340bff6258a.js:1)
at t._processSigninParams (main.2a53201b6340bff6258a.js:1)
at t.validateSigninResponse (main.2a53201b6340bff6258a.js:1)
at main.2a53201b6340bff6258a.js:1
at e.invoke (polyfills.3efb6da5a4e032fb1cf9.js:1)
at Object.onInvoke (main.2a53201b6340bff6258a.js:1)
at e.invoke (polyfills.3efb6da5a4e032fb1cf9.js:1)
at t.run (polyfills.3efb6da5a4e032fb1cf9.js:1)
at polyfills.3efb6da5a4e032fb1cf9.js:1
at e.invokeTask (polyfills.3efb6da5a4e032fb1cf9.js:1)
(用户从未登录过)。
奇怪的情况是,如果我有已登录的用户,我关闭网络浏览器并再次打开它,屏幕挂起大约 10 秒,然后我收到另一个错误:
main.2a53201b6340bff6258a.js:1 User not logged in Error: Frame window timed out
at t._error (main.2a53201b6340bff6258a.js:1)
at t._timeout (main.2a53201b6340bff6258a.js:1)
at e.invokeTask (polyfills.3efb6da5a4e032fb1cf9.js:1)
at Object.onInvokeTask (main.2a53201b6340bff6258a.js:1)
at e.invokeTask (polyfills.3efb6da5a4e032fb1cf9.js:1)
at t.runTask (polyfills.3efb6da5a4e032fb1cf9.js:1)
at t.invokeTask (polyfills.3efb6da5a4e032fb1cf9.js:1)
at invoke (polyfills.3efb6da5a4e032fb1cf9.js:1)
但是当屏幕加载并且我点击“登录”(因为用户不是)然后在加载组件之前触发“经典”AuthGuard,所以我运行标准startAuthentication()
:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
if (this.authService.isLoggedIn()) {
return true;
}
this.authService.startAuthentication();
return false;
}
可以快速登录用户。我的问题是:在登录用户方面,该功能和 signingSilent 功能有什么区别?因为它确实如此,但行为不是预期的,至少在时间和用户体验方面是这样。我希望能够“在可能的情况下让用户登录,但不提示登录屏幕”。那有意义吗?
谢谢!