5

我开发了一个运行良好的 Outlook Web 插件。这是一个任务窗格,可在约会的撰写模式下使用,它收集事件的数据,添加一些数据并将其全部发送到某个 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" 
}

我知道在发布到订阅 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"

在那种特殊情况下使用它是正确的令牌还是我需要再买一个?任何建议将不胜感激!

- 编辑 -

正如@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."
  }

根据@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
}
4

2 回答 2

5

前面的答案是正确的,错误是因为您正在获取项目范围的令牌。因为以前回调令牌只允许调用者调用GetItemGetItemAttachmentREST API。我们正在对回调令牌进行更改,以便客户端也可以调用 API 的 REST。要求是首先您应该获得readWriteMailBox许可。其次通过提供获取 REST 回调令牌isRest=true,如下所示

Office.context.mailbox.getCallbackTokenAsync({ isRest: true }, function (result))

生成的令牌将具有Mail.ReadWriteCalendar.ReadWriteContacts.ReadWriteMail.SendScopes。

也就是说,该isRest参数目前仅支持 Outlook 移动客户端。在 OWA 和 Outlook 上支持它的工作正在进行中,我们预计将在 3 月之前发布它。

于 2017-02-14T18:20:11.550 回答
2

您应该使用getCallbackTokenAsync()JWT,它将为您提供AccessToken将帮助您对 Outlook REST API 进行身份验证的 JWT

https://dev.office.com/docs/add-ins/outlook/use-rest-api

对于您的情况,按照文档,我认为您需要ReadWriteMailbox有足够的权限才能使用 Outlook REST API 注册 Web 挂钩。

注意:我在我的加载项上尝试了这个,我将加载项权限更改为,但在使用JWT.ioReadWriteMailbox检查时 JWT 令牌仍然具有我认为不起作用的。告诉我你是否在这里遇到同样的问题。scope:ParentId=<itemid>

于 2017-02-14T13:43:25.253 回答