【问题标题】:Adal Angular 4 - Refresh Token not working as expectedAdal Angular 4 - 刷新令牌未按预期工作
【发布时间】:2022-01-23 03:49:56
【问题描述】:

我在我的 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;
    }
}

任何快速帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: javascript angular azure-active-directory refresh-token adal-angular4


    【解决方案1】:

    如果您的问题是超时太快,您可以将 AcessTokenLifetime 设置为一天。 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-configurable-token-lifetimes

    【讨论】:

      【解决方案2】:

      您必须为所有 http 请求 (get/post/update/delete) 调用 this.adalService.acquireToken 方法。创建一个拦截器/http包装类并拦截每个http请求,然后调用this.adalService.acquireToken(始终返回当前有效令牌)并将返回的令牌设置为Authorization标头每个 http 请求。您必须设置 "expireOffsetSeconds": 1200 的配置(表示将在到期前 20 分钟生成新令牌。即每 40 分钟生成一个新令牌)。 expireOffsetSeconds 的默认值为 120(2 分钟),应将其增加到更高的值以避免令牌刷新方法返回 null 值。对我有用的配置是 1200。

      请参考以下链接,了解如何创建一个 http Wrapper 类来拦截每个请求并按照步骤操作, https://www.npmjs.com/package/adal-angular5

      【讨论】:

        【解决方案3】:

        您的代码运行良好,因为我从中获取了参考。我在您的代码中看到的唯一问题是 setinterval 时间! ADAL 的 acquiretoken 方法使用 expireOffsetSeconds 或默认偏移值(即 5 分钟)来计算更新间隔。这意味着,acquiretoken 方法将检查令牌到期是否在到期的偏移间隔内。如果不是,那么它将简单地返回现有令牌,因为它仍然有效。只有在该偏移间隔内(默认为到期前 5 分钟),ADAL 才能使用 acquiretoken 方法生成更新令牌。如果在此之前调用该方法,它将返回当前处于活动状态的缓存令牌,如果在到期后调用它,则会出错并显示“令牌更新失败”消息。因此,请调整您的 settimeout,使其落入“(到期 - 偏移)”窗口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 2018-01-13
          相关资源
          最近更新 更多