Цель: я пытаюсь скрыть и показать кнопку «Вход и выход» в приложении Angular с использованием IdentityServer4 и oidc client.
Проблема: ответ от моей функции isLoggedIn возвращает неопределенное значение, прежде чем он возвращает true, а * ngIf никогда не показывает кнопку «Выход из системы» и не скрывает кнопку «Вход». Смотрите код:
app.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.log('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;
}
вывод console.log:
Что я пробовал:
- Я попытался поиграться с моей версией oidc-клиента, переключаясь
между последним и 1.4.1 и убедившись, что они совпадают в
package.json и мой файл oidc-login-redirect.html.
- Превращение функции auth.service.ts isLoggedIn в обещание isLoggedIn () и ее непосредственный вызов из * nfIf с использованием асинхронного канала
auth.service.ts
Promise {
вернуть новое обещание (решить => {
разрешить (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: