Цель: я пытаюсь скрыть и показать кнопку входа и выхода в приложении Angular, используя IdentityServer4 и клиент oidc.
Проблема: ответ от моей функции isLoggedIn возвращает неопределенное значение до того, как он вернет значение true, а *ngIf никогда не показывает кнопку «Выход» и не скрывает кнопку «Войти». См. код:
приложение.componenet.html:
<span>
<button *ngIf = "!isLoggedIn()" mat-button (click) = "login()">Login</button>
<button *ngIf = "isLoggedIn()" mat-button (click) = "logout()">Logout</button>
</span>
app.componenet.ts:
isLoggedIn(){
console.info('isLoggedIn -this._authService.isLoggedIn():',
this._authService.isLoggedIn());
this._authService.isLoggedIn();
}
auth.service.ts
isLoggedIn(): boolean{
return this._user && this._user.access_token && !this._user.expired;
}
в auth.service.ts я устанавливаю пользовательский объект следующим образом:
this._userManager = new UserManager(config);
this._userManager.getUser().then(user =>{
if (user && !user.expired){
this._user = user;
}
Что я пробовал:
auth.service.ts Обещать{ вернуть новое обещание (разрешить => { разрешить(this._user && this._user.access_token && !this._user.expired); }); }
app.component.html
<button *ngIf = "!this._authService.isLoggedIn() | async" mat-button (click) = "login()">Login</button>
<button *ngIf = "this._authService.isLoggedIn() | async" mat-button (click) = "logout()">Logout</button>
Ни одна из этих вещей не сработала, и попытка обещания привела к зависанию Google Chrome:

@DanielGimenez Я добавил код, который устанавливает this._user, если у вас есть какие-либо предложения по поводу того, чего не хватает, сообщите мне.
Я ожидаю, что authService будет содержать тему поведения или что-то в этом роде и выдавать значение, когда пользователь вошел в систему. это сделало бы все намного чище в вашем компоненте, где локальная переменная установлена на ngOnInit, и ваш шаблон будет основан только на эта локальная переменная



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы где-то вызываете signinRedirectCallback в своем приложении Angular (в отличие от отдельной html-страницы, которая находится за пределами вашего SPA), вполне вероятно, что ваш код, устанавливающий this.user, вызывается до вызова обратного вызова входа.
Вы должны подписаться на addUserLoaded в UserManager и также установить пользователя в вашей службе аутентификации в обработчике этого. Таким образом, ваш пользователь всегда будет в курсе последних событий.
Если приведенный выше код был скопирован/вставлен из вашего источника, ваш app.component isLoggedIn не возвращает значение из службы аутентификации, он просто вызывает isLoggedIn в службе аутентификации, но не возвращает значение.
Спасибо за помощь. У меня был signinRedirectCallback в отдельном файле. Проблема была вызвана тем, что я просто забыл вернуть значение :( . Не очень хорошая идея писать код после дурацких дней работы, укладывания детей спать, всего нескольких часов сна и слишком большого количества кофе. Спасибо.
Я не думаю, что вы включили достаточно кода для решения этой проблемы. Нет причин оборачивать ваш код в промис или использовать
async. Задержка должна произойти из-за того, что установленоthis._user. Это имеет смысл, так как в oidc_client вы должны вызыватьmanager.getUser(), который возвращает обещание. Итак, есть несколько состояний, неизвестный, залогинился, вышли из. Убедитесь, что вы принимаете это во внимание.