间歇性无法获取AAD令牌

时间:2019-11-12 16:31:09

标签: typescript sharepoint azure-active-directory access-token spfx

我为SharePoint Online创建了一个自定义Web部件,该部件连接到由AAD保护的Web API,然后将结果显示在屏幕上。它运作良好,但全天几次停顿,试图检索访问令牌。它不会引发异常,而是会挂起。

起初,我的代码反映了connecting to AAD secured resources in SharePoint的文档中的内容,但是当AadHttpClient开始挂起时,我了解到其他人对此有疑问。因此,我更改了代码以创建一个AadTokenProvider并在其上调用getToken()以生成一个令牌,可以根据常规httpClient.get()请求将该令牌手动添加到标头中。

这并不能解决问题,但确实告诉我getToken()绝对是停止的地方。我不确定getTokenProvider()是否返回时髦的东西导致getToken()挂起,或者getToken()是否由于与SharePoint或AAD相关的原因而挂起。

似乎也经常在一段时间不活动后失败,例如它试图获取陈旧的提供者/令牌并且无法续订,但是我不知道如何确认或更改做到这一点。

为什么我无法可靠地获得令牌?

这是我的代码:

this.context.aadTokenProviderFactory.getTokenProvider()
  .then((provider) => { 
      return provider.getToken('<Client ID for my API>', false); //THIS IS WHERE IT HANGS    
  })
  .then((token) => { 
    this.context.httpClient
      .get('https://www.example.com/api/myAPI/', AadHttpClient.configurations.v1, {
        headers: [
          ['accept', 'application/json'],
          ['Authorization', 'Bearer ' + token]
        ]
      })
      .then((res: HttpClientResponse): Promise<any> => {
        return res.json();
      })
      .then(data => {
          //process data
      }, (err: any): void => {
        this.context.statusRenderer.renderError(this.domElement, err);
      });
    })
  .catch((err) => {
    this.context.statusRenderer.renderError(this.domElement, "Failed to retrieve data.");
  });

编辑:我注意到当它不起作用时,我在控制台中收到以下几个错误:

  

'<URL>'中的脚本执行受阻,因为文档的框架已被沙盒化,并且未设置“允许脚本”权限。

'<URL>'类似于https://my tenant.sharepoint.com/_forms/spfxsinglesignon.aspx

1 个答案:

答案 0 :(得分:0)

Microsoft Bug

经过back and forth with Microsoft之后,我们确认这是与基础令牌获取代码有关的错误。显然,身份验证代码中存在race()条件,无法正确解决。

截至目前(2020年1月),目前尚无修复方法,但根据bug report,大约一个月内应该已经准备就绪。

解决方法

我们发现,当您的自定义Web部件与其他OOTB Web部件在同一页面上时,例如文档库和事件Web部件,就会出现此问题。通过将文档库Web部件移到其他页面,问题就解决了。

因此,对于遇到此问题的任何人,您都可以通过从自定义Web部件中分离1个或多个OOTB Web部件来解决该问题。固定。