API Microsoft graph: Некоторые пользователи получают 403 при использовании моего приложения, другие-нет, почему?

#permissions #microsoft-graph-api

Вопрос:

Проблема

Я получаю

MicrosoftGraphИсключениеИсключение GraphException: [0]: Получено 403 для вызова https://graph.microsoft.com/beta/me/chats/[id]@unq.gbl.пробелы/участники

Я не могу понять, почему.


Исследования

разрешения в Azure

введите описание изображения здесь

как исключение появляется в моей очереди

введите описание изображения здесь

Дополнительная информация

Просто для ясности: этот же запрос с другими пользователями нашей компании работает, так что это не то, что всегда терпит неудачу. Возможно, стоит отметить, что разрешения, начинающиеся с чата, относятся к бета-версии api graph. Также получение информации о пользователе (имя собственного пользователя getGivenName) работает для всех пользователей.

Области применения приложений

Области, определенные в приложении, являются:

профиль openid пользователя offline_access.чтение почтовых ящиков.чтение календарей.чат для записи.Чат для чтения.Читайте Чат.Читайте запись

Ответ сервера

Ответ полностью:

 {
    "error": {
        "code": "Forbidden",
        "message": "Forbidden",
        "innerError": {
            "date": "2021-05-04T12:05:41",
            "request-id": "xxxxxxx-f7ea-4912-a23b-676002d0912d",
            "client-request-id": "xxxxxxx-f7ea-4912-a23b-676002d0912d"
        }
    }
}
 

Заголовки ответов также ничего не раскрывают:

введите описание изображения здесь

Также пробовал

Я также попытался повторно посетить https://login.microsoftonline.com/common/adminconsent?client_id=[id] и даю свое (администраторское) согласие, однако это ничего не меняет.

Токен JWT

Кроме того, я расшифровал как токен jwt для работающих пользователей, так и нерабочий, и у них настроены одинаковые области действия (области действия). Вот в чем разница

используемые конечные точки

  • /me/chats
  • /me
  • /me/chats/$chatId/messages
  • /me/chats/$chatId/members

Комментарии:

1. Какие администраторы пытаются получить доступ к событию — и являются ли они участниками или владельцами чата?

2. @Diana Они владельцы. Мое приложение создает резервные копии командных чатов вошедшего в систему пользователя. Он работает для большинства пользователей, только для некоторых он дает 403 запрещенных, в то время как необходимые разрешения остаются прежними. Это настоящий платок для волос.

3. Не могли бы вы поделиться идентификатором запроса для дальнейшей отладки? Я вижу, что вы добавили полный ответ на вопрос.

4. @Diana идентификатор запроса dd4afa4a-f7ea-4912-a23b-676002d0912d , я сомневаюсь, что этот идентификатор опасно публиковать каким-либо образом, однако я старался сохранить как можно больше конфиденциальности

5. Я думаю, что это вызвано отсутствием Office365 license для ваших пользователей. Попробуйте предоставить лицензию Office365 своим пользователям, прежде чем вызывать api.

Ответ №1:

Просто некоторые наблюдения и обходные пути, чтобы помочь другим, кто приходит на этот пост через Google:

  • Только тот /me/chats/$chatId/members терпит неудачу, без видимой причины. Это может быть ошибкой в бета — версии. Может быть, лучше использовать $expand аргумент, чтобы увидеть их, чтобы смягчить эту проблему.
  • для другой подгруппы пользователей получение всех чатов с конечной /me/chats точкой с помощью php sdk также завершается ошибкой с рекомендуемым кодом
   public function listChats(): array
    {
        $graph = $this->getGraph();
        $chats = [];
        $response = $graph->setApiVersion("beta")
            ->createCollectionRequest("GET", "/me/chats")
            ->setReturnType(Chat::class);
        while (!$response->isEnd()) {
            $chats = array_merge($chats, $response->getPage());
        }

        return $chats;
    }
 

потому что цикл while никогда не останавливается. @odata.nextLink всегда присутствует в ответе для этих пользователей. Вероятно, это также ошибка, так как по замыслу sdk проверяет, присутствует ли она.

   $maxRequests = 10;
   while (!$response->isEnd() amp;amp; $maxRequests > 0) {
     $chats = array_merge($chats, $response->getPage());
     $maxRequests--;
   }