Библиотека Adal js - метод this.adalService.acquireToken, который при первом входе в систему выдает «Операция обновления токена не выполнена из-за истечения времени ожидания» - PullRequest
0 голосов
/ 05 октября 2018

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

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

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

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

enter image description here

Вот мой запрос службы перехвата

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();
  }
}

}

1 Ответ

0 голосов
/ 10 октября 2018

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...