无法使用 adal.js 更新令牌

Unable to renew token with adal.js

我正在使用 Javascript(没有 Angular)将 AAD 身份验证添加到我的单页 Web 应用程序。初始登录工作正常,但一个小时后,令牌过期,我无法使用 acquireToken 更新它。当我仍然使用我的 clientID 登录时,我尝试调用 acquireToken 并且它工作正常,但是在令牌过期后,我无法更新它。它失败并显示 "Token renewal operation failed due to timeout"。

令牌过期后,我运行这样:

// ADALContext created from calling new AuthenticationContext
// passed in same clientID to acquire token as to create ADALContext 
ADALContext.acquireToken(clientID, function (error, token) {console.log(error, token)})

我在 AAD 中启用了 oauth2AllowImplicitFlow。

  "keyCredentials": [],
  "knownClientApplications": [],
  "logoutUrl": null,
  "oauth2AllowImplicitFlow": true,
  "oauth2AllowUrlPathMatching": true,

不确定我错过了哪一步。谢谢!

编辑:令牌过期后,如果我运行 acquireToken(clientID, func),我得到"User login is required"。但是,如果我调用 getCachedUser,我会返回一个用户,之后调用 acquireToken 会返回超时错误。

实际上,adal for js 会将登录信息缓存到浏览器的会话存储或本地存储中,具体取决于您在代码中的配置。你可以用chrome的开发工具看一下这个table:

因此 cachaed user 是从 adal.idtoken 解码而来的。这样就可以获得缓存的用户。而根据acquireToken的源码,更新access token前会检查登录用户是否存在,这会引发User login is required问题。

要绕过此问题,您可以在 运行 acquireToken() 之前 运行 getCachedUser() 函数更新访问令牌。

我遇到了同样的问题,我的修复成功了。在 app.component.ts 中,将此代码添加到 ngOnit()。

this.adalService.handleWindowCallback();
this.adalService.acquireToken(this.adalService.config.loginResource).subscribe(token => {
  this.adalService.userInfo.token = token;
  if (this.adalService.userInfo.authenticated === false) {
    this.adalService.userInfo.authenticated = true;
    this.adalService.userInfo.error = '';
  }
}, error => {
  this.adalService.userInfo.authenticated = false;
  this.adalService.userInfo.error = error;
  this.adalService.login();
});

当令牌过期时,应用程序组件被调用,并获取令牌以静默方式刷新令牌。但是 this.adalService.userInfo.authenticated 仍然是错误的,导致重定向或再次调用登录方法。因此手动将其设置为 true 可以修复重定向错误。 this.adalService.config.loginResource 这是由 adal-angular 本身使用我们需要令牌的资源自动设置的。 还将 expireOffsetSeconds: 320 添加到 adal 配置数据设置以及

tenant: configData.adalConfig.tenant,
  clientId: configData.adalConfig.clientId,
  redirectUri: window.location.origin,
expireOffsetSeconds: 320

expireoffsetseconds 根据我们在实际到期前指定的时间使令牌失效。