POST Ajax вызов Outlook API - доступ запрещен - PullRequest
0 голосов
/ 15 января 2019

Мне трудно отправить запрос POST в API Outlook.

Я работаю на своей локальной машине и определил redirectUrl для localhost:port

Мои GET запросы работают:

var apiUrl = "https://outlook.office.com/api/v2.0/me/calendarview?startdatetime=" + startDateTime + "&enddatetime=" + endDateTime + "&$top=" + 10;

$.ajax({
    type: 'GET',
    url: apiUrl,
    headers: {
        "Authorization": "Bearer " + token
    }
}).done(function (data) {
    processResults(data);
}).fail(function (response) {
    handleFailure();
});

но когда я пытаюсь отправить POST, я получаю это сообщение:

Доступ запрещен. Проверьте учетные данные и повторите попытку.

и мой код:

var apiUrl = "https://outlook.office.com/api/v2.0/me/events";
var postData = {
  "Subject": "Plan summer company picnic",
  "Body": {
    "ContentType": "HTML",
    "Content": "Let's kick-start this event planning!"
  },
  "Start": {
      "DateTime": "2019-01-15T11:00:00",
      "TimeZone": "Pacific Standard Time"
  },
  "End": {
      "DateTime": "2019-01-15T12:00:00",
      "TimeZone": "Pacific Standard Time"
  },
  "Attendees": [
    {
      "EmailAddress": {
        "Address": "myMail@gmail.com",
        "Name": "Name Here"
      },
      "Type": "Required"
    }
  ]
};

$.ajax({
    type: 'POST',
    url: apiUrl,
    headers: {
        "Authorization": "Bearer " + token
    },
    contentType: 'application/json',
    data: JSON.stringify(postData)
}).done(function (data) {
    processResults(data); 
}).fail(function (response) {
    handleFailure();
});

В обоих случаях я использую один и тот же токен, так что, вероятно, это не проблема входа в систему. Я также позволил Calendars.ReadWrite в приложении.

ОБНОВЛЕНИЕ

Я очистил кеш, вошел в систему, сделал GET вызов, затем сделал POST вызов, затем снова сделал GET вызов. Оба GET вызова работают, поэтому проблема не в токене или кеше.

1 Ответ

0 голосов
/ 15 января 2019

Проблема была в процессе аутентификации, по-видимому, при каждом запросе я должен указывать scope, и он должен включать несколько разрешений.

В заголовках я нашел это:

x-ms-Diagnostics: 2000008; reason = "Доступ к этому API требует следующих разрешений: 'Calendars.Read.All, Calendars.Read.Shared, Calendars.ReadWrite.All, Calendars.ReadWrite.Shared'. Однако приложению предоставляются только следующие разрешения: «Calendars.Read, Calendars.ReadWrite». »; error_category =« invalid_grant »

Даже это неправильно, поскольку Calendars.Read.All и Calendars.ReadWrite.All не существует, это должны быть Calendars.Read и Calendars.ReadWrite.

Запрос аутентификации должен выглядеть следующим образом:

var authUrl = authServer +
          "response_type=" + encodeURI(token) +
          "&client_id=" + encodeURI(clientId) +
          "&scope=" + encodeURI("https://outlook.office.com/Calendars.Read https://outlook.office.com/Calendars.Read.Shared  https://outlook.office.com/Calendars.ReadWrite https://outlook.office.com/Calendars.ReadWrite.Shared") +
          "&redirect_uri=" + redirectUrl +
          "&state=" + stateParam;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...