5

Я пытаюсь интегрироваться в API Office365 через JavaScript с помощью adal.js и jQuery (неявный поток OAuth), но у меня возникают проблемы с попыткой создать событие календаря для моего пользователя , Мой существующий код отлично работает, когда извлекает электронные письма и события календаря, но когда я пытаюсь сделать , создайте событие календаря, я последовательно получаю ответ «403 - Запретный».Разрешение отклонено (403) при попытке создания события календаря

Код действует в режиме реального времени и работает http://oauth.idippedut.dk/oauth.html. Я обращаюсь к конечной точке API 365 API по адресу https://outlook.office.com/api/v2.0/me/events.

Моя конфигурация для «делегированы разрешения» на приложение в нашем Office365/Azure арендатор Active Directory заключается в следующем: enter image description here

Конфигурация «разрешений приложения» на приложение в нашем Office365/Azure арендатор Active Directory является это: enter image description here

запрос JQuery заключается в следующем:

var event = { 
    "Subject": "Discuss the Calendar REST API", 
    "Body": { 
     "ContentType": "HTML", 
     "Content": "I think it will meet our requirements!" 
    }, 
    "Start": { 
     "DateTime": "2016-01-21T18:00:00", 
     "TimeZone": "Pacific Standard Time" 
    }, 
    "End": { 
     "DateTime": "2016-01-21T19:00:00", 
     "TimeZone": "Pacific Standard Time" 
    }, 
    "Attendees": [ 
     { 
      "EmailAddress": { 
       "Address": "[email protected]", 
       "Name": "Janet Schorr" 
      }, 
      "Type": "Required" 
     } 
    ] 
}; 

// Create calendar events 
jQuery.ajax({ 
    type: 'POST', 
    url: postCalenderEndpoint, 
    data: JSON.stringify(event), 
    contentType: "application/json", 
    headers: { 
     'Accept': 'application/json', 
     'Authorization': 'Bearer ' + token, 
    }, 

}).done(function (data) { 
    //alert(JSON.stringify(data)); 
}).fail(function (err) { 
    jQuery("#loginMessage").text('Error calling REST endpoint: ' + err.statusText + '\n' + err.responseText); 
}); 

конфигурация JQuery заключается в следующем:

var resource = 'https://outlook.office.com'; 
var postCalenderEndpoint = 'https://outlook.office.com/api/v2.0/me/events'; 
var clientID = '28a707a5-0f11-4d93-8b88-6a918544da14'; 
var tenantName = '365projectum.onmicrosoft.com'; 
var authContext = new AuthenticationContext({ 
    instance: 'https://login.microsoftonline.com/', 
    tenant: tenantName, 
    clientId: clientID, 
    postLogoutRedirectUri: window.location.origin, 
    cacheLocation: 'localStorage' 
}); 

И полученный HTTP-запрос заключается в следующем:

Host: outlook.office.com 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 
Accept: application/json 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Content-Type: application/json; charset=UTF-8 
Authorization: Bearer <my token> 
Referer: http://oauth.idippedut.dk/oauth.html 
Content-Length: 386 
Origin: http://oauth.idippedut.dk 
Connection: keep-alive 

{"Subject":"Discuss the Calendar REST API","Body":{"ContentType":"HTML","Content":"I think it will meet our requirements!"},"Start":{"DateTime":"2016-01-21T18:00:00","TimeZone":"Pacific Standard Time"},"End":{"DateTime":"2016-01-21T19:00:00","TimeZone":"Pacific Standard Time"},"Attendees":[{"EmailAddress":{"Address":"[email protected]","Name":"Janet Schorr"},"Type":"Required"}]} 

Я очень озадачен, почему я получаю 403, так как все должно быть правильно настроен.

Любая помощь будет принята с благодарностью :-)

/Jesper

+0

Я немного приблизился к ссылке API и изменил конфигурацию «ресурс» на https://outlook.office.com/Calendars.ReadWrite, и теперь код возвращает ошибку, подобную этой: «ADAL Ошибка: AADSTS50001 : Приложение https://outlook.office.com/Calendars.ReadWrite не было найдено у арендатора с именем 365projectum.onmicrosoft.com. Это может произойти, если приложение не было установлено администратором арендатора или получено согласие любой пользователь в арендаторе. Возможно, вы отправили свой запрос на аутентификацию не тому арендатору ». Так что это меня никуда не удавалось :-( –

+2

Он определенно должен что-то сделать с токеном. Microsoft продолжает обновлять/обновлять свои API-интерфейсы. Из-за этого вы, возможно, должны рассмотреть возможность использования конечной точки графика. – bloC

ответ

2

Вы настроены делегированные разрешения для Microsoft Graph, но назвать конечную точку Outlook. Вам необходимо сделать следующее: 1. измените конфигурацию своего приложения на делегированные разрешения для Outlook/Office 365 Exchange Online. 2. измените приложение, чтобы использовать конечную точку Microsoft Graph (graph.microsoft.com), то есть https://graph.microsoft.com/v1.0/me/events и сохранить текущую конфигурацию приложения.

0

Вы изначально зарегистрировали приложение с запросом разрешения «Прочитать пользователя и общие календари», а затем добавить разрешение «Полный доступ к пользовательским календарям»? Если да, вы можете быть в ситуации, когда пользователи согласились на прежнее разрешение, и, поскольку это согласие на месте, их больше не просят дать согласие на добавление нового разрешения. Это объясняет, почему ваше приложение может читать, но не может писать.

Вы были бы в этой ситуации только с пользователями, которые согласились ДО того, как вы добавили новое разрешение, и только если пользователи фактически согласились. Пользователям не пришлось бы соглашаться, если вы зарегистрировали приложение в качестве администратора и подписались с пользователями в том же арендаторе, что и администратор. Пользователи должны были согласиться, если вы зарегистрировали приложение как обычный пользователь или приложение является многопользовательским приложением.

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

Если это решит проблему, вам необходимо, чтобы ваши существующие пользователи прошли шаг, на котором вы отправляете новый запрос авторизации OAuth, используя параметр prompt = permission, чтобы они снова получили согласие.

Смежные вопросы