Токен не обновляется автоматически Angular и ADAL. js - PullRequest
0 голосов
/ 11 февраля 2020

В настоящее время мы внедрили ADAL. js, используя Angular, но, к сожалению, токен не обновляется автоматически, следующий код для обработки логики c для обновления токена

Мы добавили некоторые логики c, чтобы проверить, не истек ли токен, и обновить его автоматически, но это не работает для меня. Приложение выводит вас на белую страницу, и необходимо обновить браузер sh, чтобы снова войти в систему.

@Injectable({
  providedIn: 'root',
})
export class AuthenticationService {
  checkAuthInterval$: Observable<number>;
  constructor(
    private jwtHelperService: JwtHelperService,
    private adal: MsAdalAngular6Service
  ) {
    this.checkAuthInterval$ = interval(6000).pipe(
      tap(() => {
        this.updateSession();
      })
    );
    this.checkAuthInterval$.subscribe();
  }

  public isAuthorized(allowedRoles: string[]): boolean {
    if (allowedRoles == null || allowedRoles.length === 0) {
      return true;
    }

    const token = localStorage.getItem(
      authenticationSettings.authenticationToken
    );

    const status = this.jwtHelperService.isTokenExpired(token);
    const decodeToken = this.jwtHelperService.decodeToken(token);
    if (!decodeToken) {
      console.log('Invalid token');
      return false;
    }
    decodeToken.roles = decodeToken.roles || [];
    const allow = allowedRoles.some(r => decodeToken.roles.includes(r));
    return allow;
  }

  get profileInfo(): User {
    return this.adal.userInfo;
  }

  get expirationDate() {
    const expiration = this.profileInfo.profile.exp * 1000;
    return moment(expiration);
  }

  get issueDate() {
    const expiration = this.profileInfo.profile.iat * 1000;
    return moment(expiration);
  }

  get hasExpired(): boolean {
    const today = moment();
    return this.expirationDate.isSameOrBefore(today);
  }

  get shouldRenew(): boolean {
    const today = moment().subtract(5, 'minutes');
    return this.expirationDate.isSameOrBefore(today);
  }

  get isAuthenticated() {
    const authenticated = this.adal.isAuthenticated;
    return authenticated;
  }

  updateSession() {
    if (this.hasExpired) {
      this.adal.login();
    } else if (this.shouldRenew) {
      this.adal.RenewToken(environment.ApiBaseUrl);
    }
  }
}

1 Ответ

0 голосов
/ 13 февраля 2020

Вообще говоря, мы не рекомендуем пытаться обновить токен самостоятельно, так как вы должны позволить библиотеке обрабатывать это по мере необходимости. Мы рекомендуем приобрести токены следующим образом:

  1. Проверьте, выполнил ли пользователь вход, и если нет, отправьте его на экран входа в систему: https://github.com/AzureAD/azure-activedirectory-library-for-js#2 -login-the-user
  2. Когда ваше приложение выполняет сетевой запрос к ресурсу (например, Microsoft Graph), для которого требуется токен доступа, вызовите acquireToken с областями, необходимыми для этого запроса.
  3. Если в кэше уже есть действительный токен, этот токен должен быть возвращен вам.
  4. Если в кеше нет действительного токена (например, токена с истекшим сроком действия), и у пользователя все еще есть активный сеанс с AAD, библиотека выполнит сетевой запрос на получение нового токена и возвратит новый токен.
  5. Если в кэше нет действительного токена, и у вашего пользователя нет активного сеанса с AAD, или существует другой сценарий, требующий взаимодействия (например, согласие на новые области), библиотека вернет ошибку, и вам нужно будет вызвать один из интерактивных методов (acquireTokenPopup или acquireTokenRedirect) для решения этих проблем, а затем новый токен будет возвращен вашему приложению: https://github.com/AzureAD/azure-activedirectory-library-for-js#3 -get -an-access-token

Автоматическая попытка обновить токен самостоятельно может вызвать другие проблемы, поэтому мы не рекомендуем его. Вместо этого вызывайте acquireToken лениво прямо перед тем, как вам понадобится токен, а затем включите обработку ошибок (как описано выше) для вызова интерактивных методов при необходимости.

Пробовали ли вы описанный выше процесс, и если Итак, с какими конкретно c проблемами / ошибками вы столкнулись? Есть ли ошибки в консоли браузера или на вкладке сети?

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