使用msal.js时保持登录状态

时间:2017-08-30 14:09:31

标签: javascript outlook-restapi msal

我正在为我的Microsoft ToDo任务构建一个小型JS应用程序,并使用msal.js库来适应身份验证过程。 这工作得很好,我得到一个弹出窗口,我验证我的个人资料,弹出窗口关闭,我的任务显示在我的屏幕上。

但是:它似乎不记得我之前认证过;每次我运行我的webpack应用程序并启动页面时,它会显示弹出窗口并要求进行身份验证。一旦我进行了身份验证并刷新了我的页面,它就会向我显示任务而不再显示弹出窗口。我没有尝试等待一个小时,但我认为这与未正确刷新我的访问令牌有关。我不是那种涉及Outlook / Microsoft API的人,如果我正确使用它,我真的可以弄明白。

简而言之:我如何进行一次身份验证,以便下次启动应用程序时,无需再次进行身份验证即可显示任务?

我的初始化功能

  this.userAgentApplication = new Msal.UserAgentApplication(microsoftTasksClientId, null, function (errorDes, token, error, tokenType) {
    // this callback is called after loginRedirect OR acquireTokenRedirect (not used for loginPopup/aquireTokenPopup)
    console.log(token)
  })
  let user = this.userAgentApplication.getUser()
  if (!user) {
    const self = this
    // this.userAgentApplication = new Msal.UserAgentApplication(microsoftTasksClientId)
    this.userAgentApplication.loginPopup([`${this.apiRootUrl}Tasks.readwrite`]).then(function (token) {
      self.idToken = token
      user = self.userAgentApplication.getUser()
      if (user) {
        self.getSilentToken()
      }
    }, function (error) {
      console.log(error)
    })
  } else {
    this.getSilentToken()
  }

我的getSilentToken函数

  const self = this
  this.userAgentApplication.acquireTokenSilent([`${this.apiRootUrl}Tasks.readwrite`]).then(function (token) {
    console.log('ATS promise resolved', token)
    self.accessToken = token
    self.getTasks()
  }, function (err) {
    console.log(err)
  })

请注意,我的代码并未全部重构! ; - )

1 个答案:

答案 0 :(得分:1)

您使用的是什么版本的MSAL? 在0.1.1版本中存在一个问题,即存储默认为“sessionStorage”,并且无法真正更改。在这种情况下,您的登录名仅保存为当前打开的窗口,即使打开新的浏览器窗口,您也将被迫重新登录。 您应该使用'localStorage'来实现您想要的并将其作为UserAgentApplication的构造函数参数传递。

以下是他们回购中的修复:

https://github.com/AzureAD/microsoft-authentication-library-for-js/commit/eba99927ce6c6d24943db90dfebc62b948355f19