Реализация функции isLoggedIn() в Angular с помощью oidc-client в *ngIf

Цель: я пытаюсь скрыть и показать кнопку входа и выхода в приложении 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;
      }

вывод console.info: Реализация функции isLoggedIn() в Angular с помощью oidc-client в *ngIf

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

  1. Я попытался поиграть со своей версией oidc-client, переключив между наименьшим и 1.4.1 и убедившись, что они совпадают в package.json и мой файл oidc-login-redirect.html.
  2. Превращение функции auth.service.ts isLoggedIn в обещание isLoggedIn() и вызов ее непосредственно из *nfIf с использованием асинхронного канала

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: Реализация функции isLoggedIn() в Angular с помощью oidc-client в *ngIf

Я не думаю, что вы включили достаточно кода для решения этой проблемы. Нет причин оборачивать ваш код в промис или использовать async. Задержка должна произойти из-за того, что установлено this._user. Это имеет смысл, так как в oidc_client вы должны вызывать manager.getUser(), который возвращает обещание. Итак, есть несколько состояний, неизвестный, залогинился, вышли из. Убедитесь, что вы принимаете это во внимание.

Daniel Gimenez 28.06.2019 21:05

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

Zzz 28.06.2019 21:23

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

Stavm 28.06.2019 21:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
501
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Спасибо за помощь. У меня был signinRedirectCallback в отдельном файле. Проблема была вызвана тем, что я просто забыл вернуть значение :( . Не очень хорошая идея писать код после дурацких дней работы, укладывания детей спать, всего нескольких часов сна и слишком большого количества кофе. Спасибо.

Zzz 01.07.2019 20:35

Другие вопросы по теме