【问题标题】:Outlook Rest API Access is denied. Check credentials and try againOutlook Rest API 访问被拒绝。检查凭据并重试
【发布时间】:2020-01-17 20:40:14
【问题描述】:

我正在编写 Outlook 加载项,但我遇到了权限问题。当manifest.xml 具有ReadWriteItem 权限时,我可以使用令牌通过c# 后端服务检索消息。当我将条目更改为 ReadWriteMailbox 时,我收到 Unauthorised 响应和相关的错误消息 Access is denied。检查凭据并重试。

我需要额外的权限才能在电子邮件发送后尝试查找它。我读过的文档表明ReadWriteMailbox 是最高权限级别,包括ReadWriteItem 提供的权限。我这里有什么遗漏吗?

用于检索令牌的客户端打字稿:

Office.context.mailbox.getCallbackTokenAsync({isRest: true}, async (result:Office.AsyncResult<string>) => {
    if (result.status === Office.AsyncResultStatus.Succeeded) {
        const request = {
            bearerToken : result.value,
            restUrl : Office.context.mailbox.restUrl,
            itemId : Office.context.mailbox.convertToRestId(itemId, Office.MailboxEnums.RestVersion.v2_0)
        }
        await axios.post(MAIL_SERVICE_POLL_URL, request);
     }
});

C# 后端:

var outlookClient = _httpClientFactory.CreateClient();
outlookClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", item.BearerToken);
using (var response = await outlookClient.GetAsync($"{item.RestUrl}/v2.0/me/messages/{item.ItemId}?$select=isDraft" ))
{
    if (response.IsSuccessStatusCode &&
        JsonConvert.DeserializeObject<IsDraftModel>(await response.Content.ReadAsStringAsync()).IsDraft)
    {
        // response.StatusCode is Forbidden when ReadWriteMailbox
    }
}

【问题讨论】:

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


    【解决方案1】:

    万一其他人偶然发现这个问题,this SO answer 帮助我解决了这个问题。基本上当更改为&lt;Permissions&gt;ReadWriteMailbox&lt;/Permissions&gt; 时,查询 Outlook REST api 时需要更具体的 url。使用 ReadWriteMailbox 权限查询草稿电子邮件,网址应为 /v2.0/me/mailFolders/Drafts/messages/,而不是 /v2.0/me/messages/(与 ReadWriteItem 权限一起使用):

    using (var response = await outlookClient.GetAsync($"{item.RestUrl}/v2.0/me/mailFolders/Drafts/messages/{item.ItemId}?$select=isDraft" ))
    {
        if (response.IsSuccessStatusCode &&
            JsonConvert.DeserializeObject<IsDraftModel>(await response.Content.ReadAsStringAsync()).IsDraft)
        {
            // response.StatusCode is now Ok when ReadWriteMailbox
        }
    }
    

    同样,在SentItems文件夹上过滤时,过滤器的url为:

    var filterUrl = $"{item.RestUrl}/v2.0/me/mailFolders/SentItems/messages?{filter}";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多