Немного странно. В моем приложении 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;
}
, который быстро регистрирует пользователя. Мой вопрос: в чем разница между этой функцией и функцией signatureSilent с точки зрения входа в систему пользователя? Однако, потому что это поведение не является ожидаемым, по крайней мере, с точки зрения времени и пользовательского опыта. Я хочу иметь возможность "войти в систему пользователя, если это было возможно, но не запрашивать экран входа в систему". Имеет ли это смысл?
Спасибо!