Библиотека Adal js - метод this.adalService.acquireToken, выдающий сбой операции обновления токена из-за тайм-аута при первом входе в систему

Хотя есть ссылки на эти вопросы, но я не нашел подходящего ответа, так что надеюсь, что кто-то ответит на этот раз.

Вот сценарий: в моем приложении Angular я использую adal-angular4, который является оболочкой для Adal.js

Проблема: метод this.adalService.acquireToken только при первом входе в систему. Я получаю ошибку тайм-аута, но после входа в систему, если я обновлю страницу, тогда метод this.adalService.acquireToken работает правильно, и вот что интересное.

  1. Проблема возникает только в развернутой среде не на локальном хосте.
  2. Ошибка «Операция обновления токена не удалась из-за тайм-аута» появляется только иногда, когда сеть медленная или случайная.

введите описание изображения здесь

Вот моя служба перехватчика запросов

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> | Observable<HttpSentEvent | HttpHeaderResponse
| HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
if (req && req.params instanceof CustomAuthParams && req.params.AuthNotRequired) {
  return this.handleAuthentication(req, next, null);
} else {
  if (!this.adalService.userInfo.authenticated) {
    console.log(req, 'Cannot send request to registered endpoint if the user is not authenticated.');
  }
  var cachedToken = this.adalService.getCachedToken(environment.authSettings.clientId);
  console.log('cachedToken', cachedToken);
  if (cachedToken) {
    return this.adalService.acquireToken(resourceURL).timeout(this.API_TIMEOUT).pipe(
      mergeMap((token: string) => {
        return this.handleAuthentication(req, next, token);
      })
    ).catch(err => { console.log('acquire token error', err); return throwError(err) })
  } else {
    this.adalService.login();
  }
}

}


person Rahul Rai    schedule 05.10.2018    source источник


Ответы (1)


Что ж, после 1-2 дней борьбы я нашел первопричину. Опубликуйте этот ответ, чтобы он помог другим.

Библиотека adal-angular4 использует 1.0.15 версию adal-angular, которая является старой версией, где тайм-аут по умолчанию для loadFrameTimeout составляет 6 секунд, и в этой версии нет конфигурации для увеличения loadFrameTimeout. пожалуйста, смотрите ссылку ниже

конфигурации Adal

Теперь при первом входе в систему происходит много шагов.

  1. После аутентификации приложение перенаправляет на настроенный URI с помощью лазурного AD, добавляя идентификатор и токен доступа в URL-адрес ответа.
  2. Затем библиотека устанавливает все эти токены в локальное хранилище или хранилище сеанса, в зависимости от конфигурации.
  3. Затем ваши приложения загружаются и начинают звонить в webapi. Теперь вот что происходило интересное: для каждого запроса я вызываю метод acquToken для приложения webapi, поэтому, если сеть работает медленно, вызовы collectToken будут давать ошибку тайм-аута, поскольку 6 секунд иногда недостаточно. Но для некоторых API он сможет получить токен.
  4. Теперь при первом вызове метода collectToken требуется время, но для последующего запроса он берет токен из кеша, если он доступен, поэтому ошибка тайм-аута возникала только в первый раз, а не после этого.

Итак, в этой библиотеке пока нет возможности увеличить loadFrameTimeout, поэтому я использовал Angular5 warpper, который использует 1.0.17 версию adal-angular, где мы можем увеличить loadFrameTimeout, что решило мою проблему. .

person Rahul Rai    schedule 10.10.2018