首页 > 解决方案 > Outlook Rest API 访问被拒绝。检查凭据并重试

问题描述

我正在编写 Outlook 加载项,但遇到权限问题。当manifest.xml具有ReadWriteItem权限时,我可以使用令牌使用 ac# 后端服务检索消息。当我将条目更改为ReadWriteMailbox我得到未经授权的响应和相关的错误消息访问被拒绝。检查凭据并重试。

我需要额外的权限才能在电子邮件发送后尝试查找它。我读过的文档表明这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
    }
}

标签: outlookoutlook-addinoffice-jsoffice-addins

解决方案


万一其他人偶然发现这个问题,这个 SO 答案帮助我解决了这个问题。基本上,在查询 Outlook rest api 时需要更改为<Permissions>ReadWriteMailbox</Permissions>更具体的 url。使用ReadWriteMailbox权限查询草稿电子邮件,该 url 应该是/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}";

推荐阅读