[英]Adal Angular 4 - Refresh Token not working as expected
我在我的 Angular 7 应用程序中使用 adal-angular4 ( https://www.npmjs.com/package/adal-angular4 ) 进行 Azure AD 身份验证。 adal-angular 提供了一个访问令牌,其有效期为 1 小时。 我需要实现刷新令牌功能,以便使用 AdalService 的 acquireToken() 方法获取新令牌。 我添加了使用 acquireToken() 方法获取刷新令牌所需的逻辑。 我什至得到了刷新的令牌,但在令牌过期后我的会话仍然过期。 我编写了每 5 分钟运行一次的逻辑。 逻辑检查Token过期的Epoch时间与当前时间的差异。 如果这个时间差小于 5 分钟,那么我调用 AdalService acquireToken() 方法,它会返回新的 Token。 但是,令牌仍然会在 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;
}
}
任何快速帮助将不胜感激。 提前致谢。
如果您的问题是超时过早,您可以将 AcessTokenLifetime 设置为一天。 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-configurable-token-lifetimes
您必须为所有 http 请求(get/post/update/delete)调用this.adalService.acquireToken方法。 创建一个拦截器/http 包装器类并拦截每个http 请求,然后调用this.adalService.acquireToken (始终返回当前有效令牌)并将返回的令牌设置为每个http 请求的Authorization 标头。 您必须设置“expireOffsetSeconds”的配置:1200 (意味着将在到期前 20 分钟生成新令牌。即,每 40 分钟将生成一个新令牌)。 expireOffsetSeconds 的默认值是 120(2 分钟),应该增加到更高的值以避免令牌刷新方法返回空值。 对我有用的配置是 1200。
请参阅以下链接以了解如何创建 http Wrapper 类来拦截每个请求并按照步骤操作, https://www.npmjs.com/package/adal-angular5
您的代码工作正常,因为我从中获取了参考。 我在您的代码中看到的唯一问题是 setinterval 时间! ADAL 的acquiretoken 方法使用expireOffsetSeconds或默认偏移值(即5 分钟)来计算更新间隔。 这意味着,acquiretoken 方法将检查令牌到期是否在到期的偏移间隔内。 如果不是,那么它将简单地返回现有令牌,因为它仍然有效。 只有在该偏移间隔内(默认为到期前 5 分钟),ADAL 才能使用 acquiretoken 方法生成更新令牌。 如果在此之前调用该方法,它将返回当前处于活动状态的缓存令牌,如果在到期后调用它,则会出错并显示“令牌更新失败”消息。 因此,调整您的 settimeout 使其落入“(到期 - 偏移)”窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.