Ошибка Microsoft GraphAPI 403 при получении пользовательских событий в приложении SPfx - PullRequest
0 голосов
/ 16 января 2020

Я написал приложение SharePoint SPfx, размещенное в SharePoint Online, используя Microsoft GraphAPI для сбора информации о профиле пользователя, а также событий календаря. По документам Microsoft я объявил свои области действия в файле package-solution. json и одобрил запрос через страницу управления SharePoint APi. Я могу прочитать информацию о каждом профиле, однако, я получаю ошибку 403, когда пытаюсь получить доступ к событиям календаря, кроме своих собственных. Календарь пользователей не является закрытым, он открыт для всей организации.

Пакетное решение. json Запрос на разрешение

"webApiPermissionRequests": [
      {
        "resource": "Microsoft Graph",
        "scope": "User.Read"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "User.ReadBasic.All"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "People.Read"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "Calendars.Read"
      }
    ]
  }

Изображение, одобренное администратором

Экран утвержденных разрешений приложения

код запроса:

private _searchUserCalendar(keyword: string): Promise<any[]> {
    console.log("connection to GraphAPI event domain")
    return new Promise<any[]>((resolve, reject) => {
      this._context.msGraphClientFactory.getClient()
        .then((client: MSGraphClient): void => {
          client
            .api(`/users/${keyword}/calendar/events`) // The api i.e> /me | /users
            .version('v1.0')
            .select("showAs,start,subject, end")
            .top(5)
            .get((error, response: any, rawResponse?: any) => {
              if (error) {
                console.log("ooops somethign went wrong get events",error);
                reject(error);
              }
              var users:Array<any>=new Array<any>();

              // Map the JSON response to the output array
              if (response != null && response != undefined) {
                console.log(response);
                response.value.map((item: any) => {
                  console.log("found events for:", item)
                }); // mapping over users
              }
              resolve(users);  

            });
        });
    });
  }

Ответ об ошибке

{error: {code: "ErrorAccessDenied", message: "Access is denied. Check credentials and try again.",…}}
error: {code: "ErrorAccessDenied", message: "Access is denied. Check credentials and try again.",…}
code: "ErrorAccessDenied"
message: "Access is denied. Check credentials and try again."
innerError: {request-id: "5dca3d4f-ab4c-4237-8ff4-78d8cacbd43b", date: "2020-01-16T19:05:26"}
request-id: "5dca3d4f-ab4c-4237-8ff4-78d8cacbd43b"
date: "2020-01-16T19:05:26"

Я перепробовал все любая помощь будет принята с благодарностью.

  • Я проверил мой запрос на графическом обозревателе, и он работал нормально
  • Я удалил / переустановил приложение
  • Я отклонил и повторно утвердил запрос разрешений на панели управления API
  • Я изменил URL-адрес запроса с использования идентификатора пользователя на использование электронной почты (работал только для моего профиля, но по-прежнему не работал ни для кого другого)
  • У меня были пользователи, которые делились со мной своим календарем и давали разрешения на чтение / запись, но все равно не работали, потому что это разрешение определяется приложением c, а не делегировано пользователем.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

После попытки использования разных областей разрешений, в том числе предложенных @chad, кажется, что Calendar.Read.Shared сработало. Однако это работает, потому что это делегированное разрешение, для которого пользователи должны неявно делиться своим календарем со всей организацией или вошедшим в систему пользователем. Это вводит в заблуждение и противоречит тому, что я прочитал в документации GraphAPI, найденной здесь в разделе Календарь> Разрешение приложения:

Calendars.Read | Чтение календарей во всех почтовых ящиках Приложение сможет считывать события всех календарей без зарегистрированного пользователя.

... и

Calendars.Read.Shared | Чтение пользовательских и общих календарей Позволяет программе читать события во всех календарях, к которым пользователь имеет доступ, включая делегированные и общие календари.

Поэтому, согласно предыдущим инструкциям, все, что мне нужно, это Calendars.Read чтобы прочитать все события в календаре пользователя, созданного этим пользователем. Логика c использования Calendars.Read.Shared будет также читать все события, которыми обменивается пользователь, включая те, которые не созданы, но переданы пользователю.

Наконец, я отметил на это ответили, потому что это единственное, что сработало для меня (несколько), а не потому, что это решило исходную проблему. Документация по этой теме c противоречива и запутана. На данный момент это мой ответ, если Microsoft не изменила что-либо или не прояснила проблему, или вы не нашли что-то еще или / и мой лог c имеет недостатки. Если моя логика c и понимание неверны, пожалуйста, напишите ответ и дайте мне знать. В конце концов, для этого и существует сообщество.

Спасибо

0 голосов
/ 16 января 2020

User.Read и User.ReadBasic.All не имеют разрешения на выполнение того, что вы пытаетесь сделать.

Этот URL говорит о чтении календаря общих событий.

Например, Гарт поделился с Джоном своим календарём по умолчанию и предоставил Джону доступ на чтение. Если Джон вошел в ваше приложение и предоставил делегированные разрешения (Calendars.Read.Shared или Calendars.ReadWrite.Shared), ваше приложение сможет получить доступ к стандартному календарю Garth и событиям в этом календаре, как описано ниже.

Можете ли вы попробовать добавить Calendar.Read.Shared

...