从Outlook Web插件访问Outlook RestAPI
我开发了一个工作正常的Outlook Web插件。这是一个Taskpane,可以在约会模式下使用,收集事件数据,添加一些数据并将其全部发送到某个API。从Outlook Web插件访问Outlook RestAPI
现在我想要做的是将已验证的用户订阅到Outlook Rest API,以便在事件被删除时得到通知。
认购调用看起来应该像这样的:
POST https://outlook.office.com/api/v2.0/me/subscriptions HTTP/1.1
Content-Type: application/json
{
@odata.type:"#Microsoft.OutlookServices.PushSubscription",
Resource: "https://outlook.office.com/api/v2.0/me/events",
NotificationURL: "https://myNotifAPI.azurewebsites.net/api/send/myNotifyClient",
ChangeType: "Deleted",
ClientState: "blabla"
}
我知道我需要提供有效的身份验证承载令牌时发布到订阅URL所以我试图调用此方法在我的加载项:
_mailbox = Office.context.mailbox;
_mailbox.getUserIdentityTokenAsync(getUserIdentityTokenCallback);
在功能getUserIdentityTokenAsync
,我称之为的WebAPI控制器,验证我的令牌,并发送回外接:
AppIdentityToken token = (AppIdentityToken)AuthToken.Parse(rawToken);
token.Validate(new Uri(request.AudienceUrl));
return token;
我想使用的令牌发布到https://outlook.office.com/api/v2.0/me/subscriptions
(使用邮差),但我得到了一个401说:
reason="The audience claim value is invalid '<MyAddInURL>'.";error_category="invalid_resource"
它是在特定的情况下,使用权令牌或做我需要得到一个又一个?任何建议,将不胜感激!
- 编辑 -
至于建议由@伯努瓦 - 帕特雷我试图让使用getCallbackTokenAsync
,而不是getUserIdentityTokenAsync
令牌,但是当我打电话https://outlook.office.com/api/v2.0/me/subscriptions
我确实收到了403:
"error": {
"code": "ErrorAccessDenied",
"message": "The api you are trying to access does not support item scoped OAuth."
}
按照要求通过@伯努瓦 - 帕特雷这里的令牌内容:
{
"nameid": "[email protected]xxx",
"ver": "Exchange.Callback.V1",
"appctxsender": "https://localhost:44444/[email protected]",
"appctx": {
"oid": "3a8a4f92-a010-40bd-a093-xxxxxx",
"puid": "10033FFF9xxxxx",
"smtp": "[email protected]",
"upn": "[email protected]",
"scope": "ParentItemId:AAMkADE4NTk2MDNjLTI4NGEtNDZkNS1hMzg4LTE3MzI2NGJhZWRkZQBGAAAAAAD+YYA7CnMtRZsrwJ7l6m44BwCcSer9F+cXSrWNauuHQlZ7AAAAAAENAACcSer9F+cXSrWNaxxxxxxxx"
},
"iss": "[email protected]xx",
"aud": "00000002-0000-0ff1-ce00-000000000000/[email protected]",
"exp": 1487087672,
"nbf": 1487087372
}
您应该使用getCallbackTokenAsync()
这是智威汤逊,这将使你的AccessToken
,这将有助于您验证为Outlook REST API
https://dev.office.com/docs/add-ins/outlook/use-rest-api
对于你的情况,该文件下面,我想你会需要ReadWriteMailbox
有足够的权限来注册使用Outlook REST API进行Web挂钩。
注:我想这对我的加载,我改变了外接权限ReadWriteMailbox
但JWT令牌时JWT.io检查仍然有scope:ParentId=<itemid>
我认为行不通。告诉我你是否在这里遇到同样的问题。
上一个答案是正确的,错误是因为你正在得到一个项目作用域标记。因为之前的回拨令牌只允许呼叫者拨打GetItem
和GetItemAttachment
REST API。我们正在对回调令牌进行更改,以便客户端也可以调用API的REST。该要求是首先你应该有readWriteMailBox
权限。通过提供isRest=true
,像下面
Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result))
生成的令牌将有Mail.ReadWrite
,Calendar.ReadWrite
,Contacts.ReadWrite
,并Mail.Send
作用域第二得到休息回调令牌。
也就是说isRest
参数现在只支持outlook移动客户端。支持OWA和Outlook的工作正在进行中,我们预计将在3月份发布。
感谢百万@ benoit-patra!我真的在网上搜索这样一个链接!我现在感到羞愧:)让我测试一下,我会尽快回复你! – MaxSC
好吧,我试了一下,但不幸的是'getCallbackTokenAsync()'返回的令牌似乎没有给我正确的访问权限来调用'https://outlook.office.com/api/v2.0/我/订阅',因为我确实收到403说“_您试图访问的api不支持项范围OAuth_” – MaxSC
@MaxSC我认为有'getCallbackTokenAsync'时使用'ReadWriteMailbox'插件的错误应该提供一个JWT,然后用'scope'的AccessToken不仅仅是currentItem,这似乎是问题所在。你能提供你在JWT中看到的东西吗(当然真正的值被混淆了) –