当从 Outlook 调用时,使用 Exchange EWS 在 UpdateItem 中访问被拒绝 JavaScript Api (office.js)

Access Denied in UpdateItem with Exchange EWS when called from Outlook JavaScript Api (office.js)

我们使用 office JavaScript api 开发了一个 Outlook 加载项,需要更新邮件消息的类别。

尝试通过 Exchange EWS 调用 UpdateItem 时,使用加载项令牌 - 失败并返回 500。

请参阅请求和响应:http://pastebin.com/55x2d2Ht

  1. 应用程序的清单权限是 ReadWriteMailbox(最高)
  2. 在 OWA /manageapps 中选择应用程序时 - 它显示 "When this adding is clicked, it will be able to: Read, create and update email in your mailbox"
  3. 尝试了来自 mailbox.getCallbackTokenAsync 的令牌和使用 makeEwsRequestAsync。
  4. EWS GetItem 和 CreateItem 操作成功 - 只有 UpdateItem 失败
  5. 对 UpdateItem 的响应:500 请求的 Web 方法对此调用方或应用程序不可用。
  6. 它是 500(而不是 403)这一事实可能意味着 UpdateItem 操作完全被加载项应用程序阻止
  7. jwt 令牌(来自 getCallbackTokenAsync)没有 'scp' 密钥
  8. 如果同一个 UpdateItem XML Soap 数据包与另一个令牌一起发送,从在 Azure 中注册并具有 Read/Write 权限的测试 OAuth 应用程序发送到 Exchange --> 它会成功。此应用程序 jwt 令牌 "scp":"full_access_as_user Mail.Read Mail.ReadWrite Mail.Send"
  9. 尝试使用附加令牌与另一个交易所用户一起尝试 - 也失败了。
  10. Office AddIn 文档声明在插件上下文中支持 EWS UpdateItem 操作。参见 Office Dev Center
  11. 总结:只有带有插件 OAuth 令牌的 Ews UpdateItem 失败。其他操作成功,使用其他令牌(或基本身份验证)发布 UpdateItem 也成功。

您应该能够将 UpdateItem 与 makeEwsRequestAsync 一起使用。您不能使用 getCallbackTokenAsync,因为此调用 returns 是只读标记,只能用于 GetItemGetAttachment。使用 makeEwsRequestAsync 发出请求时,您的 XML SOAP 请求(makeEwsRequest 中的数据参数应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <UpdateItem MessageDisposition="SaveOnly" ConflictResolution="AutoResolve" xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
      <ItemChanges>
        <t:ItemChange>
          <t:ItemId Id = "AAMkAGI3NDEzZjRhLWU3ZjktNGViNy04MTI1LWFhOWRiZDRlY2QwNABGAAAAAADBaXFYA4KPQqsQBpmZF2+2BwAa6KJzOcvaRKcc5UfLbF5tAAAA4fK1AAACk4HLLuxASqDPNieBkIv8AANIKlICAAA=" ChangeKey="CQAAABYAAAACk4HLLuxASqDPNieBkIv8AANIb3mG"/>
          <t:Updates>
            <t:SetItemField>
              <t:FieldURI FieldURI = "item:Categories" />
              <t:Message>
                <t:Categories>
                  <t:String>Workout</t:String>
                </t:Categories>
              </t:Message>
            </t:SetItemField>
          </t:Updates>
        </t:ItemChange>
      </ItemChanges>
    </UpdateItem>
  </soap:Body>
</soap:Envelope>

您应该不需要在订单调用中传递回调令牌 makeEwsRequestAsync