outlook - 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
}
}
解决方案
万一其他人偶然发现这个问题,这个 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}";
推荐阅读
- c# - 如何使用 C# 从扫描的 PDF 文档中提取文本?
- c# - PINVOKE 内存管理的单元测试
- robotframework - 在机器人框架的控制台输出中显示时间
- mysql - MySQL插入分区'p'
- android - 如何在 Xamarin android api 级别超过 28 中获取包签名
- powershell - 替换Powershell中比较对象中的侧面指示器
- git - 如何为 gerrit 事件配置 Gerrit Webhook
- java - mongo ping 诊断命令何时返回 { ok: 0 }?
- swift - 在swift中通过类名和属性名获取属性
- typescript - 根据值向界面添加键?