无法使用adal.js续订令牌

时间:2017-02-14 20:01:47

标签: adal adal.js

我正在使用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会返回超时错误。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,并且我的修复工作正常。在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与{p>一起添加到adal配置数据设置中

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

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

答案 1 :(得分:1)

实际上,js的adal会将登录信息缓存到会话存储或浏览器中的本地存储,取决于您在代码中的配置。您可以使用chrome的开发工具来查看此表: enter image description here

所以cachaed user是从adal.idtoken解码的。所以你可以得到缓存的用户。根据{{​​3}}的源代码,它将在续订访问令牌之前检查登录用户是否存在,这将引发User login is required问题。

要绕过此问题,您可以在运行getCachedUser()之前运行acquireToken()功能以续订访问令牌。