Ошибка фрейма oidc-client при ручном вызове signatureSilent - PullRequest
0 голосов
/ 08 июля 2019

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

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...