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