从Outlook JavaScript Api(office.js)调用ExchangeI中UpdateItem中的访问权限被拒绝

时间:2016-11-15 17:06:54

标签: ms-office office365 exchangewebservices outlook-web-addins

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

当尝试使用Exchange EWS调用UpdateItem时,使用加载项令牌 - 它以500失败。

请参阅:http://pastebin.com/55x2d2Ht

查看请求和回复
  1. 应用程序的清单权限是ReadWriteMailbox(最高)
  2. 当在OWA / manageapps中选择应用程序时 - 它会显示"点击此添加后,它将能够:在您的邮箱中阅读,创建和更新电子邮件"
  3. 从mailbox.getCallbackTokenAsync尝试了两个令牌并使用了makeEwsRequestAsync。
  4. EWS GetItem和CreateItem操作成功 - 只有UpdateItem失败
  5. 对UpdateItem的响应:500此调用方或应用程序无法使用请求的Web方法。
  6. 它是500(而不是403)的事实可能意味着完全阻止了对addin app的UpdateItem操作
  7. jwt令牌(来自getCallbackTokenAsync)没有' scp'键
  8. 如果使用另一个令牌发送相同的UpdateItem XML Soap数据包,则从Azure中注册的测试OAuth应用程序读取/写入Exchange权限 - >它成功了。这个app jwt标记用" scp":" full_access_as_user Mail.Read Mail.ReadWrite Mail.Send"
  9. 使用加载项令牌与另一个交换用户一起尝试 - 也失败了。
  10. Office AddIn文档声明在addin的上下文中支持EWS UpdateItem操作。请参阅Office Dev Center
  11. 摘要:只有使用Addin OAuth令牌的Ews UpdateItem失败。其他操作成功,使用其他令牌(或Basic Auth)发布UpdateItem也会成功。

1 个答案:

答案 0 :(得分:2)

您应该可以将UpdateItem与makeEwsRequestAsync一起使用。您无法使用getCallbackTokenAsync,因为此调用会返回只读的令牌,该令牌只能用于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时传入回调令牌。