【问题标题】:Trying to get immutable ids via v2.0 REST API尝试通过 v2.0 REST API 获取不可变 ID
【发布时间】:2020-05-22 03:15:31
【问题描述】:

我正在开发一个 Outlook 插件(目前在网络上进行测试),我需要获取一些不可变的 ID,以便我可以在我们的平台上存储对这些电子邮件的引用。我读了这个great response by the Outlook team 并且整天都在尝试调用 translateExchangeIds 没有成功。首先,我真的找不到说明这个端点实际上存在于 REST v2.0 API 上的文档。我可以说它确实存在,因为我收到错误消息,说如果我只是稍微更改 json 对象的大小写,则有效负载与端点所说的不匹配。我目前遇到错误

code: "ErrorAccessDenied" message: "Access is denied. Check credentials and try again."

这似乎很明显我应该做的是检查我的权限。我可以找到的文档提到我需要 User.ReadBasic。不过,这确实不是我为 Outlook 插件定义权限的方式。在我添加的 manifest.xml 文件中,我定义了权限

 <Permissions>ReadWriteMailbox</Permissions>

调用这个端点应该绰绰有余

const getImmutableId = async () => new Promise<string>((resolve) => {
  Office.context.mailbox.getCallbackTokenAsync(
    { isRest: true },
    (result: Office.AsyncResult<string>) => {
      const headers = new Headers();
      headers.append('Authorization', `Bearer ${result.value}`);
      headers.append('content-type', 'application/json');
      headers.append('data-type', 'json');
      headers.append('process-data', 'false');
      fetch(`${Office.context.mailbox.restUrl}/v2.0/me/translateExchangeIds`, {
        headers,
        method: 'POST',
        body: JSON.stringify({
          InputIds: [
            Office.context.mailbox.item.itemId,
          ],
          SourceIdType: 'ewsId',
          TargetIdType: 'restImmutableEntryId',
        }),
      }).then((response: Response) => {
        if (response.ok) {
          response.json().then((restResponse: {targetId: string, sourceId: string}[]) => {
            resolve(restResponse[0].targetId);
          });
        } else {
          // eslint-disable-next-line no-console
          console.warn('there was a failire to get an immutable id falling back to mutable rest id');
          resolve(Office.context.mailbox.convertToRestId(
            Office.context.mailbox.item.itemId, Office.MailboxEnums.RestVersion.v2_0,
          ));
        }
      });
    },
  );
});

任何帮助将不胜感激。

【问题讨论】:

    标签: office-js outlook-addin outlook-web-addins


    【解决方案1】:

    您阅读的 StackOverflow 帖子 (link) 指出示例代码不完整,因为 getAccessTokenAsync API 调用提供的令牌缺少 User.ReadBasic.All 权限,而 translateExchangeIds REST API 需要该权限。有一个关于不可变 ID 的现有 UserVoice post。请在那里添加你的声音。我们在规划过程中会考虑用户语音的功能请求。

    【讨论】:

    • 所以 getAccessTokenAsync 仅在 Office js 库的预览版中可用,对吗? getCallbackTokenAsync docs.microsoft.com/en-us/office/dev/add-ins/outlook/… InternetMessageId 之类的属性呢?我将无法使用它来查找消息,但它是独一无二且不变的?
    • 是的,getAccessTokenAsync 处于预览阶段,根据我们在此处的文档:docs.microsoft.com/en-us/javascript/api/office/…。从 getCallbackTokenAsync 获取的令牌不包含 User.ReadBasic.All 权限。 User.ReadBasic.All (docs.microsoft.com/en-us/graph/…) 是 Graph API 的权限,需要嵌入到令牌中才能成功调用 translateExchangeIds。此权限与加载项清单 xml 文件中的权限不同。
    • Internet 消息 ID 是唯一的,但是,它们是可选的,并且取决于创建它们的服务器。由于您的电子邮件帐户可以接收来自多个来源的电子邮件,因此每个邮箱的 Internet 消息 ID 可能并不可靠。更多信息在这里:faqs.org/rfcs/rfc2822.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多