4

Я разработал надстройку Outlook Web, которая работает нормально. Это Taskpane, которая доступна в режиме компоновки встреч и собирает данные о событиях, добавляет несколько и отправляет все в API где-то.Доступ к Outlook RestAPI из веб-сайта Outlook

Теперь я хотел бы подписаться на аутентифицированный пользователь в API внешнего Outlook, чтобы получить уведомление о его удалении.

Абонентская вызов должен выглядеть как этот:

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 подписки, поэтому я попытался вызвать этот метод в моем Add-In:

_mailbox = Office.context.mailbox; 
_mailbox.getUserIdentityTokenAsync(getUserIdentityTokenCallback); 

в функции getUserIdentityTokenAsync, я называю WebAPI контроллер, который проверяет мой маркер и отправить его обратно в Add-In:

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" 

ли право Токен использовать в данном конкретном случае, или мне нужно, чтобы получить еще один ? Любые советы будут оценены!

- EDIT -

Как было предложено @ Benoit-патре Я попытался получить маркер, используя 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-патре вот содержание Токен:

{ 
    "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() это JWT, который даст вам AccessToken, который поможет вам аутентификации для Перспективы REST API

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

Для Вашего случая, следуя документации, я думаю, что вам нужно ReadWriteMailbox иметь достаточные разрешения для регистрации веб-крючки с API-интерфейсом REST Outlook.

Примечание: Я попробовал это на моем надстройке, я изменил надстройку разрешение на ReadWriteMailbox но маркер JWT, когда осмотрены с JWT.io до сих пор для scope:ParentId=<itemid>, которые я думаю, не будет работать. Скажи мне, если у тебя такая же проблема.

+0

Спасибо миллион @ benoit-patra! Я буквально ищу в Интернете такую ​​ссылку! Мне теперь стыдно :) Позвольте мне проверить это, и я вернусь к вам! – MaxSC

+0

Хорошо, я попробовал, но, к сожалению, токен, возвращаемый 'getCallbackTokenAsync()', похоже, не дает мне прав доступа для вызова 'https://outlook.office.com/api/v2.0/ me/subscriptions', так как я получил сообщение 403: «_Api, к которому вы пытаетесь получить доступ, не поддерживает объект OAuth_» – MaxSC

+0

@MaxSC Я думаю, что есть ошибка 'getCallbackTokenAsync', когда использование с добавлением' ReadWriteMailbox' должно обеспечивать JWT, а затем AccessToken с 'scope' больше, чем просто currentItem, который, кажется, является проблемой. Можете ли вы предоставить то, что вы видите в своем JWT (с реальными значениями, запутанными, конечно) –

4

Предыдущий ответ правильный, ошибка заключается в том, что вы получаете токен с областью действия. Поскольку ранее токены обратного вызова позволяли вызывающему абоненту звонить GetItem и GetItemAttachment REST API. Мы вносим изменения в токен обратного вызова, чтобы клиенты могли также вызвать REST API. Требование сначала должно иметь разрешение readWriteMailBox.Во-вторых получить маркер REST обратного вызова, предоставляя isRest=true, как показано ниже

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

Полученный маркер будет иметь Mail.ReadWrite, Calendar.ReadWrite, Contacts.ReadWrite и Mail.Send областях применения.

Сообщалось, что параметр isRest поддерживается только для мобильного клиента Outlook прямо сейчас. Работа по его поддержке в OWA и Outlook продолжается, и мы планируем выпустить ее к марту.

+0

благодарит за отзыв. Любое обходное решение, которое может возникнуть при ожидании выхода поддержки Outlook? – MaxSC

+0

@MaxSC Работа вокруг будет загружать файл office.JS из среды dogfood. Это изменение должно быть доступно в течение недели или около того. Я включу ссылку, когда она будет доступна –

+0

Отлично, дайте мне знать, как только она будет доступна для тестирования! – MaxSC