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)".