API Office365 - доступ к другим пользователям/комнатным календарям
Я пытаюсь создать приложение, которое будет иметь доступ ко всем корпоративным календарям (пользователям, комнатам и т.д.).
В настоящее время мой поток авторизации будет входить от имени пользователя-арендатора и использовать токены обновления для доступа к необходимым ресурсам. Как только я сделаю запрос:
https://outlook.office365.com/api/v1.0/users/{[email protected]}/events
На мое приложение отвечает 401
Из моего собрания кажется, что этот поток ограничен одной областью пользователя. Хотя администратор арендатора должен иметь разрешение на просмотр любого из ресурсов комнаты, комната технически является пользователем, поэтому API ответит с запрещенной ошибкой. Теперь кажется, что правильный поток является администратором арендатора, который должен предоставить разрешение на мое приложение, используя новый Service OAuth Flow.
Чтение этого сообщения кажется, что API использует OAuth тип полномочий учетных данных клиента (только для токенов приложений). Вместо использования конечной точки /oauth/common
теперь я должен использовать /oauth/tenant-id
, который я могу получить с помощью токена JWT, возвращаемого в типе ответа code+id_token
. Это приводит к моему первому вопросу:
Использует ли поток OpenID единственный способ изначально получить идентификатор арендатора?
Далее, для меня ситуация немного нечеткая.
Теперь нам нужно сгенерировать сертификат SSL X.509 и загрузить отпечаток/значение в наш манифест приложения Azure. Легко.
Затем в соответствии с обсуждением в Office 365 Rest API - Проверка подлинности в течение недели мы создаем конкретный код JWT, base64 и подписываем его с нашим сертификатом.
На самом деле я не получил последние несколько шагов, но я могу опубликовать свои результаты, когда смогу. Я просто убедился, что, похоже, я следую правильной процедуре, для каких ресурсов я пытаюсь получить доступ. Я знаю, что токены службы - это довольно новая функция, просто прискорбно, что мне пришлось найти поток отправки подписанного JWT на Stackoverflow, а не официальную документацию MSFT...
Я также заметил, что, поскольку мы используем поток учетных данных клиента, мы не получим refresh_token
в ответе. Поэтому для моего последнего вопроса:
При доступе к разным ресурсам (например, API Graph API/Office365) я просто получаю различный токен доступа для каждого ресурса, используя мой подписанный запрос вместо используя токены обновления для нескольких ресурсов?
Если общее направление, похоже, идет правильно, дайте мне знать! Любая помощь приветствуется.
Ответы
Ответ 1
Поздно к вечеринке, но я тоже борюсь за нее, и вот что я нашел.
Маршрут OAuth в Office365 позволит вам получить доступ к вашему собственному календарю. Не имеет значения, какие разрешения у приложения есть в Azure или что вы настраиваете для каждого пользователя. Это ограничение API.
Это было подтверждено MSFT в комментариях к этому вопросу StackOverflow:
API Office365 - доступ администратора к другим событиям календаря пользователей/комнат
Однако вы можете использовать Basic Auth для доступа к календарю другого человека.
1) Настройте пользователя "Первичный" (тот, который вы аутентифицируете), чтобы получить доступ к "Вторичному" пользователю (та, который вы хотите просмотреть). Для этого перейдите к Свойствам Exchange для Вторичного пользователя → Делегирование почтовых ящиков и предоставите полный доступ к Первичному пользователю.
2) Передайте аутентификацию вместе с запросом API Office365:
<?php
$username = '[email protected]';
$password = 'mypass';
$URL = 'https://outlook.office365.com/api/v1.0/users/[email protected]/events';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$URL);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result=curl_exec ($ch);
curl_close ($ch);
print_r($result);
?>
3) Если вы все сделали правильно, теперь у вас есть события для Вторичного пользователя!
Ответ 2
Вы следуете правильному пути. Вам понадобится один токен на ресурс, который предоставит вам доступ ко всем пользователям. Когда этот токен истекает, вы просто запросите новый.