Max*_*xSC 5 office-addins outlook-addin outlook-restapi office-js outlook-web-addins
我开发了一个工作正常的Outlook Web加载项.这是一个Taskpane,可以在约会的撰写模式中使用,它可以收集事件的数据,添加一些数据并将其全部发送到某个API.
我现在要做的是将经过身份验证的用户订阅到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"
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要在发布到订阅URL时提供有效的身份验证承载令牌,因此我尝试在我的加载项中调用此方法:
_mailbox = Office.context.mailbox;
_mailbox.getUserIdentityTokenAsync(getUserIdentityTokenCallback);
Run Code Online (Sandbox Code Playgroud)
在函数中getUserIdentityTokenAsync,我调用一个WebApi Controller来验证我的令牌并将其发送回加载项:
AppIdentityToken token = (AppIdentityToken)AuthToken.Parse(rawToken);
token.Validate(new Uri(request.AudienceUrl));
return token;
Run Code Online (Sandbox Code Playgroud)
我试图使用该令牌发布到https://outlook.office.com/api/v2.0/me/subscriptions(使用Postman),但我得到了401说:
reason="The audience claim value is invalid '<MyAddInURL>'.";error_category="invalid_resource"
Run Code Online (Sandbox Code Playgroud)
它是在特定情况下使用的正确令牌还是我需要另一个?任何建议将不胜感激!
- 编辑 -
正如@ benoit-patra所建议的那样,我尝试使用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."
}
Run Code Online (Sandbox Code Playgroud)
根据@ benoit-patra的要求,这里是令牌内容:
{
"nameid": "9d643d8c-b301-4fe1-83f7-bf41b1749379@57bcd3d9-685a-4c41-8c7d-xxxxxx",
"ver": "Exchange.Callback.V1",
"appctxsender": "https://localhost:44444/NewAppointment.html@57bcd3d9-685a-4c41-8c7d-xxxxxx",
"appctx": {
"oid": "3a8a4f92-a010-40bd-a093-xxxxxx",
"puid": "10033FFF9xxxxx",
"smtp": "max@xxxx.onmicrosoft.com",
"upn": "max@xxxx.onmicrosoft.com",
"scope": "ParentItemId:AAMkADE4NTk2MDNjLTI4NGEtNDZkNS1hMzg4LTE3MzI2NGJhZWRkZQBGAAAAAAD+YYA7CnMtRZsrwJ7l6m44BwCcSer9F+cXSrWNauuHQlZ7AAAAAAENAACcSer9F+cXSrWNaxxxxxxxx"
},
"iss": "00000002-0000-0ff1-ce00-000000000000@57bcd3d9-685a-4c41-8c7d-xxxxx",
"aud": "00000002-0000-0ff1-ce00-000000000000/outlook.office365.com@57bcd3d9-685a-4c41-8c7d-xxxx",
"exp": 1487087672,
"nbf": 1487087372
}
Run Code Online (Sandbox Code Playgroud)
小智 5
之前的答案是正确的,错误是因为您获得了一个项目作用域标记.由于此前回调令牌只允许呼叫者调用GetItem和GetItemAttachmentREST的API.我们正在对回调令牌进行更改,以便客户端也可以调用REST的REST.要求首先是您应该获得readWriteMailBox许可.其次通过提供REST回调令牌isRest=true,如下所示
Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result))
Run Code Online (Sandbox Code Playgroud)
生成的令牌都会有Mail.ReadWrite,Calendar.ReadWrite,Contacts.ReadWrite,和Mail.Send作用域.
也就是说,该isRest参数目前仅支持Outlook移动客户端.在OWA和Outlook上支持它的工作正在进行中,我们希望在3月之前发布它.
您应该使用getCallbackTokenAsync()JWT,它将为您提供AccessToken帮助您对 Outlook REST API 进行身份验证的信息
https://dev.office.com/docs/add-ins/outlook/use-rest-api
对于您的情况,根据文档,我认为您需要ReadWriteMailbox拥有足够的权限才能使用 Outlook REST API 注册 Web 挂钩。
注意:我在我的外接程序上尝试了此操作,我将外接程序权限更改为,ReadWriteMailbox但使用JWT.io检查时的 JWT 令牌仍然具有scope:ParentId=<itemid>我认为不起作用的功能。告诉我你是否也有同样的问题。
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |