Реализация функции isLoggedIn () в Angular с oidc-клиентом в * ngIf - PullRequest
0 голосов
/ 28 июня 2019

Цель: я пытаюсь скрыть и показать кнопку «Вход и выход» в приложении 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: enter image description here

Что я пробовал:

  1. Я попытался поиграться с моей версией oidc-клиента, переключаясь между последним и 1.4.1 и убедившись, что они совпадают в package.json и мой файл oidc-login-redirect.html.
  2. Превращение функции 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: enter image description here

1 Ответ

1 голос
/ 01 июля 2019

Если вы вызываете signinRedirectCallback в своем приложении Angular где-то (в отличие от отдельной html-страницы, которая находится за пределами вашего SPA), вполне вероятно, что ваш код, устанавливающий this.user, вызывается до вызова callin callin. 1001 *

Вы должны подписаться на addUserLoaded в UserManager и установить пользователя в вашей службе аутентификации из этого обработчика. Таким образом, ваш пользователь всегда будет в курсе событий.

Если приведенный выше код был скопирован / вставлен из вашего источника, ваш app.component isLoggedIn не возвращает значение из службы аутентификации, он просто вызывает isLoggedIn в службе аутентификации, но не возвращает значение.

...