【问题标题】:Outlook Add-in REST call errorOutlook 加载项 REST 调用错误
【发布时间】:2018-06-21 19:33:58
【问题描述】:

我正在尝试使用 Outlook REST API 标记(标记)一条消息,但我不断收到错误消息。我尝试过使用不同的 REST URL,但没有帮助 - 错误只是有所不同。

我认为清单中允许这样做的重要值是:

<Requirements>
    <Sets>
      <Set Name="Mailbox" MinVersion="1.1" />
    </Sets>
  </Requirements>
...
<Permissions>ReadWriteItem</Permissions>
  <Rule xsi:type="RuleCollection" Mode="Or">
    <Rule xsi:type="ItemIs" ItemType="Message" FormType="Read" />
  </Rule>
...
<VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="VersionOverridesV1_0">
    <Requirements>
      <bt:Sets DefaultMinVersion="1.3">
        <bt:Set Name="Mailbox" />
      </bt:Sets>
    </Requirements>

这是我正在尝试执行的导致错误的部分:

Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result)
{
    if (result.status === "succeeded")
    {
        var accessToken = result.value;
        var itemId = getItemRestId();
        var restUrl = Office.context.mailbox.restUrl + "/api/v2.0/messages/" + itemId;

        var request = {
            url: restUrl,
            type: "PATCH",
            dataType: 'json',
            data: { "Flag": { "FlagStatus": "Flagged" } },
            headers: { 
                "Authorization": "Bearer " + accessToken, 
                "Conntent-Type": "application/json" 
            }
        };

        $.ajax(request)
            .done(function (item)
            {
                // dome something
            })
            .fail(function (error)
            {
                // handle error
            });
    }
    else
    {
        // handle error
    }
});

function getItemRestId()
{
    if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS')
    {
        return Office.context.mailbox.item.itemId;
    }
    else
    {
        return Office.context.mailbox.convertToRestId(
            Office.context.mailbox.item.itemId,
            Office.MailboxEnums.RestVersion.Beta
        );
    }
}

上面这段代码会报错:

{"readyState":4,"responseText":"","status":404,"statusText":"Not Found"}

如果我尝试 JSON.stringify() 我得到的请求的数据属性:

{"readyState":4,"responseText":"","status":404,"statusText":"Not Found"}

如果我将其余 URL 更改为(在旧示例中​​可以看到):

'https://outlook.office.com/api/beta/me/messages/'+ itemId;

以及请求的 headers 属性(在旧示例中​​可见):

headers: {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json'
}

然后我得到以下错误:

{
  "readyState": 4,
  "responseText": "{\"error\":{\"code\":\"ErrorAccessDenied\",\"message\":\"The api you are trying to access does not support item scoped OAuth.\"}}",
  "responseJSON": {
    "error": {
      "code": "ErrorAccessDenied",
      "message": "The api you are trying to access does not support item scoped OAuth."
    }
  },
  "status": 403,
  "statusText": "Forbidden"
}

谁能看到我在这里做错或遗漏了什么?

我在 Outlook 2016 中调试,帐户是 Office 365。

更新:提琴手输出

这是我自己的样本发送的请求(导致 403 Forbidden) 确切错误: {"error":{"code":"ErrorAccessDenied","message":"您尝试访问的 api 不支持项目范围的 OAuth。"}}

PATCH https://outlook.office.com/api/beta/me/messages/AAMkAGNmMDllMTVhLTI3ZDctNDYxZS05ZWM5LTA3ZWQzMzYyNDBiOABGAAAAAAD6OQOAoKyKT6R02yYFe0bIBwD5fUzv7OgQQYAILztCFSSWAALg591rAAC382lxTQ2HQpUKZsAGTeWVAARPu37CAAA= HTTP/1.1
Content-Type: application/json
Accept: application/json, text/javascript, */*; q=0.01
Authorization: Bearer <long token code removed...>
Referer: https://localhost:44394/MessageRead.html?_host_Info=Outlook$Win32$16.02$da-DK
Accept-Language: da-DK
Origin: https://localhost:44394
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: outlook.office.com
Content-Length: 33
Connection: Keep-Alive
Cache-Control: no-cache

{"Flag":{"FlagStatus":"Flagged"}}

这是演示项目发送的请求(结果为 200 OK)

PATCH https://outlook.office.com/api/beta/me/messages/AAMkAGNmMDllMTVhLTI3ZDctNDYxZS05ZWM5LTA3ZWQzMzYyNDBiOABGAAAAAAD6OQOAoKyKT6R02yYFe0bIBwD5fUzv7OgQQYAILztCFSSWAALg591rAAC382lxTQ2HQpUKZsAGTeWVAARPu37CAAA= HTTP/1.1
Content-Type: application/json
Accept: application/json, text/javascript, */*; q=0.01
Authorization: Bearer <long token code removed...>
Referer: https://<company.domain.com>:1443/outlookaddindemo/RestCaller/RestCaller.html?_host_Info=Outlook$Win32$16.02$da-DK
Accept-Language: da-DK
Origin: https://<company.domain.com>:1443
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: outlook.office.com
Content-Length: 47
Connection: Keep-Alive
Cache-Control: no-cache

{
  "Flag": {
    "FlagStatus": "Flagged"
  }
}

我能看到的唯一区别是第二个请求有效负载似乎已格式化为读取,而数据方面与前一个相同。

我似乎在这里找不到问题 - 我什至确保两个项目都使用相同版本的 JQuery。

【问题讨论】:

  • 您的 Outlook 客户端版本是多少? Outlook 2016 中存在一个关于 REST 令牌的已知错误。
  • 在原帖中,客户端是 Outlook 2016 for Windows。但它也可以是浏览器中的 Outlook 2013 或 Outlook.com/Office365。这必须适用于所有人。
  • 如果这确实是 Outlook 2016 for Windows 中未修复的错误,是否有人知道解决方法,或者如果您使用的是 Outlook 2016 for Windows,您只是运气不佳?
  • 该错误已修复,这就是我要求您提供版本的原因。检查文件->Office 帐户,然后查找关于 Outlook 部分。它应该列出一个版本并构建。
  • 版本为:2016 MSO (16.0.8730.2175) 32-bit。我怀疑这是错误,因为我刚刚尝试了一个通过 REST API 标记消息的演示项目,并且它在我的客户端中工作......我使用 Fiddler 检查两个请求,它们看起来是相同的,但我的只是没有由于某种原因不能工作:(

标签: outlook-addin office-addins outlook-restapi


【解决方案1】:

如果您需要通过 REST 对项目进行写访问,则需要在清单中的 Permissions 元素中指定 ReadWriteMailbox。尽管有它的名字,ReadWriteItem 并没有给你一个适当范围的令牌。 ReadWriteMailbox 以外的任何权限级别都会提供项目范围的令牌,并且正如错误所说,您尝试执行的操作不支持项目范围的 OAuth。

详情请参阅https://docs.microsoft.com/en-us/outlook/add-ins/use-rest-api,但这里是相关位:

插件权限和令牌范围

重要的是要考虑您的外接程序需要通过 REST API 进行的访问级别。在大多数情况下,getCallbackTokenAsync 返回的令牌将仅提供对当前项目的只读访问权限。即使您的外接程序在其清单中指定了ReadWriteItem 权限级别也是如此。

如果您的外接程序需要对用户邮箱中的当前项目或其他项目的写入权限,您的外接程序必须在其清单中指定 ReadWriteMailbox 权限级别。在这种情况下,返回的令牌将包含对用户消息、事件和联系人的读/写访问权限。

【讨论】:

  • 这太奇怪了!我可以发誓我最初把那个值放在那里,因为我已经阅读了这篇文章并且知道它必须设置为邮箱而不是项目,所以我什至没有再看那里......好吧我猜那是为什么让别人的眼睛看东西总是好的:)它不起作用,谢谢!
  • 啊哈!我现在明白发生了什么。我已将清单文件(带有特定于站点的 URL 等)复制到解决方案的 Web 项目中,以便在发布时将其作为输出的一部分。但是,这不是在 VS 中启动解决方案时使用的清单。所以我对清单文件进行了更改,而不是在 VS 中调试时使用的清单文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多