Доступ к Outlook RestAPI из веб-надстройки Outlook

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

Сейчас я хочу подписать аутентифицированного пользователя на 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-адресу подписки, поэтому я попытался вызвать этот метод в своей надстройке:

_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
}

2 ответа

Предыдущий ответ правильный, ошибка в том, что вы получаете жетон с областью действия. Поскольку ранее токены Callback позволяли звонить только вызывающему 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 продолжается, и мы планируем выпустить ее к марту.

Вы должны использовать getCallbackTokenAsync() это JWT, который даст вам AccessToken это поможет вам аутентификации для Outlook REST API

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

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

ПРИМЕЧАНИЕ. Я пробовал это на своей надстройке, я изменил разрешение надстройки на ReadWriteMailbox но токен JWT при проверке с помощью JWT.io все еще scope:ParentId=<itemid> который, я думаю, не сработает. Скажите, есть ли у вас такая же проблема?

Другие вопросы по тегам