【问题标题】:Accessing Skype for Business API (UCWA) : HTTP 403 / Forbidden访问 Skype for Business API (UCWA):HTTP 403 / 禁止
【发布时间】:2017-09-04 11:49:01
【问题描述】:

我正在尝试使用 Node.js 测试脚本连接并使用 Skype for Business API (UCWA) following this procedure

我在 Azure AD 中注册了一个测试应用,并检查了与 Skype for Business Online 相关的所有权限。

我正在这样做(简化):

var adal = require('adal-node');
var https = require('https');

var clientId = 'a5cbbd......cc4a1'; // = app ID
var clientSecret = 'IOSDk1......LJ6vE=' // test key from Azure AD

var context = new adal.AuthenticationContext('https://login.windows.net');

// 'Autodiscover' step
// (callRestAPI() makes an HTTPS request using https.request() and returns results as JSON)

callRestAPI('webdir.online.lync.com', 443, '/autodiscover/autodiscoverservice.svc/root', 'GET', null /* no specific headers */, function(err, res) {

  if (err) { console.log(err); return err; }

  // extract discovered domain (I get something like https://webdir1e.online.lync.com)
  let regex = new RegExp('^(https?://[^/]*)', 'g');
  let sfbDiscoveredDomain = regex.exec(response._links.user.href);
  sfbDiscoveredDomain = sfbDiscoveredDomain[1];

  // 'Acquire token' step

  context.acquireTokenWithClientCredentials(sfbDiscoveredDomain, clientId, clientSecret, function(err, res) {

    if (err) { console.log(err); return err; }

    regex = new RegExp('^https?://([^/]*)', 'g');
    let sfbHost = regex.exec(res.resource);
    sfbHost = sfbHost[1]; // here I get something like 'webdir1e.online.lync.com'

    // 'Resending an autodiscovery request with the bearer token' step

    callRestApi(sfbHost, 443, '/autodiscover/autodiscoverservice.svc/root/oauth/user', 'GET', {'Authorization': 'Bearer '+res.accessToken}, function(err, res)    {

      if (err) { console.log(err); return err; }
      console.log(res);

    });
  });
});

最后一步(重新发送自动发现请求)总是失败并出现错误 HTTP 403/Forbidden

还有一个有趣的响应头:

'x-ms-diagnostics': '28070;source="AM41E00EDG01.infra.lync.com";reason="服务不允许来自该来源的跨域请求。"'

...但是我还是不明白为什么会出现这个错误。

我在各种代码示例(X-Ms-OriginHost)中到处都看到了额外的标头,但没有运气。

【问题讨论】:

    标签: azure skype-for-business ucwa


    【解决方案1】:

    此问题(服务不允许来自此来源的跨域请求。)主要是由“跨域资源共享 (CORS)”和请求访问的地址未“列入白名单”引起的。

    当服务器在本地时,Skype for Business 管理员可以通过(更多信息的here)进行配置(请参阅 StackOverflow 问题here):

    $x = New-CsWebOrigin -Url "https://apps.contoso.com"
    Set-CsWebServiceConfiguration -Identity "{YOUR_IDENTITY}" -CrossDomainAuthorizationList @{Add=$x}
    

    但是,由于您的 Skype for Business 不在本地(在线),我认为您无能为力,因为此部分主要由 Microsoft 的云管理员控制。

    但是,由于 Skype for Business Online 支持 UCWA,我认为您这边有问题。您是否按照here 的说明检查了应用程序是否正确注册?如果是,fiddler 跟踪可能有助于查看导致该问题的原因。

    【讨论】:

    • 感谢您的快速回复。但是,按照您的建议,我已经仔细检查了注册和身份验证所需的所有 6 个步骤(看起来步骤 1-2 应该在 Azure 管理中进行,步骤 4-6 来自我的 Node.js 代码)。结果始终相同(错误 HTTP 403 / Forbidden 与相同的“x-ms-diagnostics”附加标头有关 CORS 问题)。这可能是服务器端的问题吗?
    • 是的,正如提琴手提到的那样,我们将能够确定它。在那里您可以看到 X-Ms-Origin 将具有哪些值。也可以在浏览器中执行此操作(调出开发人员工具 (F12)、清除浏览器缓存 (ctrl+R)、转到网络选项卡并“开始捕获”。)基于它可能能够的发现指出更详细的设置问题。但是,我认为 Microsoft Azure / Skype for Business Online 支持可能是一个更好的选择。到目前为止,我会说您的 azure 服务器不允许与 Skype for Business 在线通话...
    猜你喜欢
    • 2018-05-15
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多