Итак, у меня есть пользовательская страница .aspx с чистым JS / jQuery (поэтому без Angular), которую я загружаю в Sharepoint Online и могу добавить в качестве веб-части или iFrame на сайт в Sharepoint Online.Я хочу отображать события календаря Outlook, и я также использую FullCalendar.io для отображения части.
Сюда также входит защита ADAL (Azure AD), поскольку она необходима для API Outlook.
Итак, сначала я аутентифицируюсь в Azure AD, получаю свой приобретенный токен, а затем передаю этот токен функции, которая создает мой календарь FullCalendar.io на странице.Это попытается получить события Календаря Outlook и красиво отобразить их в FullCalendar.
Вот примеры, которым я следовал:
https://codeatwork.wordpress.com/2017/04/16/using-outlook-rest-apis-in-sharepoint-online/
https://github.com/AzureAD/azure-activedirectory-library-for-js
https://www.paitgroup.com/blog/display-events-from-an-outlook-calendar-in-sharepoint-using-office-365-apis
Я также добавил разрешения из ссылки 1 в Azure AD.зарегистрированное приложение на портале Azure!
Вот мой код:
<script>
var $this = this;
$(document).ready(function() {
window.config = {
tenantId: '{tenant}',
clientId: '{clientId}',
popUp: true,
redirectUri: '{redirectURI}',
endpoints: {
"https://outlook.office.com/api/v2.0/me/events":"https://outlook.office.com/",
}
};
var authenticationContext = new AuthenticationContext(config);
authenticationContext.handleWindowCallback();
if (authenticationContext.getCachedUser()) {
authenticationContext.acquireToken(config.clientId, function (errorDesc, token, error) {
if (error) { //acquire token failure
if (config.popUp) {
// If using popup flows
authenticationContext.acquireTokenPopup(config.clientId, null, null, function (errorDesc, token, error) {});
}
else {
// In this case the callback passed in the Authentication request constructor will be called.
authenticationContext.acquireTokenRedirect(config.clientId, null, null);
}
}
else {
//acquired token successfully
$this.DisplayEvents(token);
}
});
}
else {
// Initiate login
authenticationContext.login();
}
});
function DisplayEvents(adalToken) {
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay,listWeek'
},
navLinks: true, // can click day/week names to navigate views
editable: true,
eventLimit: true, // allow "more" link when too many events
events: function(start, end, timezone, callback) {
var headers = new Headers();
var bearerToken = "Bearer " + adalToken;
headers.append('Authorization', bearerToken);
var options = {
method: 'GET',
headers: headers,
mode: 'no-cors'
};
var outlookEndpoint = 'https://outlook.office.com/api/v2.0/me/events?$select=Subject,Organizer,Start,End';
fetch(outlookEndpoint, options)
.then(function (response) {
console.log(response);
});
}
});
}
</script>
Как видите, токен передается вызову fetch в функции событий функции fullCalendar ()функция.Я попытался сделать обычный вызов AJAX 'GET', но я получаю ошибки CORS.То же самое, когда я опускаю "mode: 'no-cors'" из моих опций.Извлечение происходит из-за примера github, который я привел выше!
Теперь я получаю 401 Несанкционированную ошибку и ответ, заполненный статусом: 0 и телом: ноль и т. Д.
У кого-то еще была эта проблема, или он может видеть, что я делаю неправильносделать аутентификацию неудачной?