Adal Angular 4 - токен обновления не работает должным образом

Я использую adal-angular4 (https://www.npmjs.com/package/adal-angular4) для аутентификации Azure AD в моем приложении Angular 7. adal-angular предоставляет токен доступа, срок действия которого составляет 1 час. Мне нужно реализовать функциональность Refresh Token, чтобы я мог получить новый Token с помощью метода takeToken() AdalService. Я добавил необходимую логику для получения токена обновления с помощью метода acquToken (). Я даже получаю обновленный токен, но срок моего сеанса истекает после истечения срока действия токена. Я написал логику, которая запускается каждые 5 минут. Логика проверяет разницу времени истечения срока действия токена и текущего времени. Если эта разница во времени меньше 5 минут, я вызываю метод AdalService takeToken(), который возвращает мне новый токен. Однако токен по-прежнему истекает через 1 час и тайм-ауты моего сеанса.

Ниже приведены данные моего кода:-app.component.ts

ngOnInit() {

    // Acquire Refresh Token
    if (this.adalService.userInfo.authenticated) {
      setInterval(() => {
        this.authService.refreshToken(); }, 300000); // 300000 ms = 5 minutes
    }
  }

auth.service.ts

refreshToken(): boolean {
        const token = this.adalService.userInfo.token;
        const decodedToken = jwt_decode(token);
        const tokenExpiresIn = decodedToken['exp'];
        const currentEpochTime = Math.floor(new Date().getTime() / 1000.0);
        const epochDiffInMins = Math.floor((tokenExpiresIn - currentEpochTime) / 60); // Epoch time difference in minutes
        if (epochDiffInMins < 5) {
        this.adalService.acquireToken(environment.adalConfig.clientId).toPromise().then((data) => {
            this.processLoginRequest(this.adalService.userInfo);
            return true;
        },
        (error) => {
            return false;
        });
        }
        return false;
    }

processLoginRequest(response: any) {
        if (response) {
            localStorage.setItem(Constants.localStorageKeys.isLoggedIn, 'true');
            localStorage.setItem(Constants.localStorageKeys.apiToken, JSON.stringify(response.token));
            localStorage.setItem(Constants.localStorageKeys.userId, response.userName);
            location.reload();
        }
    }

auth-gaurd.service.ts

@Injectable()
export class AuthGuardService implements CanActivate {
    constructor(
        private router: Router,
        private logger: LoggerService,
        private authService: AuthService,
        private adalService: AdalService
    ) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        const url: string = state.url;

        if (!this.adalService.userInfo.authenticated) {
            this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
            return false;
        }
        return true;
    }
}

Любая быстрая помощь будет оценена по достоинству. Заранее спасибо.

3 ответа

Вы можете установить AcessTokenLifetime равным одному дню, если ваша проблема в том, что тайм-аут истекает слишком рано. https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-configurable-token-lifetimes

Вы должны вызвать метод this.adalService.acquireToken для всех HTTP-запросов (get / post / update / delete). Создайте класс-перехватчик / http-оболочку и перехватите каждый HTTP-запрос, затем вызовите this.adalService.acquireToken (всегда возвращает текущий действительный токен) и установите возвращенный токен в заголовок авторизации каждого HTTP-запроса. Вы должны установить конфигурацию "expireOffsetSeconds": 1200 (означает, что новый токен будет сгенерирован за 20 минут до истечения срока действия, то есть каждые 40 минут будет генерироваться новый токен). Значение expireOffsetSeconds по умолчанию - 120 (2 минуты), которое следует увеличить до некоторого более высокого значения, чтобы метод обновления токена не возвращал нулевое значение. Конфигурация работала у меня 1200.

Перейдите по ссылке ниже, чтобы узнать, как создать класс http Wrapper для перехвата каждого запроса, а также выполнить шаги https://www.npmjs.com/package/adal-angular5

Ваш код работает нормально, так как я взял ссылку оттуда же. Единственная проблема, которую я вижу в вашем коде, это установить интервал времени! Метод AcquireToken ADAL использует либо expireOffsetSeconds,или значение смещения по умолчанию, т. е. 5 минут, для расчета интервала обновления. Это означает, что методAcquireToken проверит, находится ли срок действия токена в пределах интервала смещения от истечения срока действия или нет. Если это не так, то он просто вернет существующий токен, потому что он все еще действителен. Только в течение этого интервала смещения (который по умолчанию составляет 5 минут до истечения срока действия) ADAL сможет сгенерировать маркер обновления с помощью методаAcquireToken. Если вы вызовете метод до этого, он вернет кешированный токен, который в данный момент активен, а если вы вызовете его после истечения срока действия, он выдаст ошибку с сообщением «ошибка обновления токена». Поэтому настройте свой settimeout таким образом, чтобы он попадал в окно "(expiry - offset)".

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