繁体   English   中英

Adal Angular 4 - 刷新令牌未按预期工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM