4

我开发了一个工作正常的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 
} 

回答

2

您应该使用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>我认为行不通。告诉我你是否在这里遇到同样的问题。

+0

感谢百万@ benoit-patra!我真的在网上搜索这样一个链接!我现在感到羞愧:)让我测试一下,我会尽快回复你! – MaxSC

+0

好吧,我试了一下,但不幸的是'getCallbackTokenAsync()'返回的令牌似乎没有给我正确的访问权限来调用'https://outlook.office.com/api/v2.0/我/订阅',因为我确实收到403说“_您试图访问的api不支持项范围OAuth_” – MaxSC

+0

@MaxSC我认为有'getCallbackTokenAsync'时使用'ReadWriteMailbox'插件的错误应该提供一个JWT,然后用'scope'的AccessToken不仅仅是currentItem,这似乎是问题所在。你能提供你在JWT中看到的东西吗(当然真正的值被混淆了) –

4

上一个答案是正确的,错误是因为你正在得到一个项目作用域标记。因为之前的回拨令牌只允许呼叫者拨打GetItemGetItemAttachment REST API。我们正在对回调令牌进行更改,以便客户端也可以调用API的REST。该要求是首先你应该有readWriteMailBox权限。通过提供isRest=true,像下面

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

生成的令牌将有Mail.ReadWriteCalendar.ReadWriteContacts.ReadWrite,并Mail.Send作用域第二得到休息回调令牌。

也就是说isRest参数现在只支持outlook移动客户端。支持OWA和Outlook的工作正在进行中,我们预计将在3月份发布。

+0

感谢您的反馈意见。您可能会考虑等待Outlook支持发布的任何解决方法? – MaxSC

+0

@MaxSC解决方法是从dogfood环境加载office.JS文件。这一变化应该在一周左右内提供。我将包括链接,当其可用 –

+0

伟大,让我知道,只要它可用于测试! – MaxSC