Доступ к 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>
который, я думаю, не сработает. Скажите, есть ли у вас такая же проблема?