【问题标题】:Unable to renew token with adal.js无法使用 adal.js 更新令牌
【发布时间】:2020-04-16 14:45:16
【问题描述】:

我正在使用 Javascript(无 Angular)将 AAD 身份验证添加到我的单页 Web 应用程序。初始登录工作正常,但一个小时后,令牌过期,我无法使用 acquireToken 更新它。当我仍然使用我的 clientID 登录并且它工作正常时,我尝试调用acquireToken,但是在令牌过期后,我无法更新它。它因“令牌更新操作因超时而失败”而失败。

令牌过期后,我运行了这个:

// 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),我得到“需要用户登录”。但是,如果我调用 getCachedUser,我会返回一个用户,然后调用 acquireToken 返回超时错误。

【问题讨论】:

  • 您获得的初始访问令牌的有效期为 1 小时。一旦过期,调用acquireToken 将不得不去Azure AD 获取新的访问令牌,这就是失败的步骤。如果没有更多信息,很难诊断具体问题,您能否获得提琴手跟踪并检查您从 STS 返回的错误并回发。
  • 你的意思是来自请求URL“login.microsoftonline.com/microsoft.onmicrosoft.com/oauth2/…....”的响应头吗?如果是这样,据我所知,我没有收到错误。但是,如果我在 acquireToken 上提供无效的客户端 ID,则会得到以下信息:“Location:http:///#error=invalid_resource...”。也许我找错地方了?我在上面的问题中添加了一些额外的 cmets。谢谢!
  • 通过添加对 ADALContext.handleWindowCallback() 的调用来修复问题 :)
  • @ChristinaK 我遇到了同样的问题。你什么时候调用了 handleWindowCallback ?

标签: adal adal.js


【解决方案1】:

我遇到了同样的问题,我的修复工作奏效了。在 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();
});

当 token 过期时,app 组件被调用,获取 token 会静默刷新 token。但是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 根据我们在实际到期前指定的时间使令牌失效。

【讨论】:

    【解决方案2】:

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

    所以cachaed user 是从adal.idtoken 解码的。所以你可以得到缓存的用户。并且根据acquireToken的源代码,在更新访问令牌之前会检查登录用户是否存在,这会引发User login is required的问题。

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

    【讨论】:

    • 如果我在 acquireToken() 之前运行 getCachedUser(),那么我会返回一个 null 令牌,并显示“令牌更新操作因超时而失败”。有没有办法可以检查集群上的 AAD cookie 是否已超时?我不认为它应该只在 1 小时后。谢谢!
    • 我认为我们无法在 AAD IDP 服务器上看到此类登录会话或 cookie 状态。不过我在 Github 上发现了和你一样的问题,你可以试试github.com/AzureAD/azure-activedirectory-library-for-js/issues/…底部的解决方案
    • 如果对您有帮助,您可以将其标记为答案,这对面临相同问题的社区来说是有好处的。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2014-02-26
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多