我们有一个Outlook加载项,我们需要使用它的itemId更新邮件项目的单值扩展属性。
用于更新扩展程序属性的文档:Here
对于HTTP调用,我们收到以下响应:
请求网址:
PATCH https://outlook.office365.com/api/v2.0/me/messages('{mailItemId}')
响应:
{
"error": {
"code": "ErrorAccessDenied",
"message": "The api you are trying to access does not support item scoped OAuth."
}
}
进一步调整后,我们发现在请求标头中使用的auth令牌可能存在问题。我们正在使用Outlook的getCallbackTokenAsync
API来获取令牌,其中isRest
选项对于REST令牌设置为true。在堆栈溢出中寻找相关问题时,我发现了以下问题:
这些建议此api中可能存在一个错误,因为该错误会返回以项目为范围的令牌而不是以邮箱为范围的令牌。项目范围令牌的有效负载包含Exchange.Callback.V1
作为版本值,Exchange.Callback.V2
用于邮箱范围的令牌。
我们在https://jwt.io/上解码了响应令牌,发现返回的令牌确实是一个范围限定的项目,因此,在将扩展属性的更新值推送到邮件项目时,我们被阻止了。还写道,此问题可能在16.0.7902.1000之后的版本中得到解决。不过,我正在Outlook的Web浏览器客户端上尝试此操作,并且不确定生成版本与我的情况如何相关。
最近有没有其他人遇到过这种行为,或者该问题是否有任何解决方法?
************** 编辑 ****************
我遵循了注释中的建议,现在可以执行来自邮递员的补丁请求,但是不能从外接程序中执行补丁请求。我在控制台中收到400错误的请求错误。以下是响应的版本,其中删除了特定的键名和URL。
{
"_body": {
"error":{
"code":"RequestBodyRead",
"message":"An unexpected instance annotation name '{key name}' was found
when reading from the JSON reader, In OData, Instance
annotation name must start with @."
}
},
"status": 400,
"ok": false,
"statusText": "Bad Request",
"type": 2
}
我该如何解决?
答案 0 :(得分:1)
请查看getCallbackTokenAsync API文档:docs.microsoft.com/en-us/office/dev/add-ins/reference/…。您需要在清单中指定ReadWriteMailbox权限。