Пытаетесь получить события календаря Outlook с помощью Javascript и получаете 401 несанкционированную ошибку? - PullRequest
0 голосов
/ 06 марта 2019

Итак, у меня есть пользовательская страница .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 и телом: ноль и т. Д.

У кого-то еще была эта проблема, или он может видеть, что я делаю неправильносделать аутентификацию неудачной?

1 Ответ

1 голос
/ 07 марта 2019

Вам необходимо изменить метод acquToken, как показано ниже. Просто замените "config.clientId" на "https://outlook.office.com/".

if (authContext.getCachedUser()) {
        authContext.acquireToken("https://outlook.office.com/", function (error, token) {
            if (error) { //acquire token failure
                if (config.popUp) {
                    // If using popup flows
                    authContext.acquireTokenPopup("https://outlook.office.com/", null, null, function (errorDesc, token, error) { });
                }
                else {
                    // In this case the callback passed in the Authentication request constructor will be called.
                    authContext.acquireTokenRedirect("https://outlook.office.com/", null, null);
                }
            }
            else {
                //acquired token successfully
                // alert('token success');
                DisplayEvents(token);
            }
        });
    }
    else {
        // Initiate login
        authContext.login();
    }

Кроме того, вы можете найти подробную информацию об ошибке 401 с помощью Rest Client или почтальона. Например, это ответ в Rest Client. enter image description here

...