Я пытаюсь создать приложение, которое будет иметь доступ ко всем календарям организации (пользователям, комнатам и т. Д.).
В настоящее время мой поток авторизации будет входить от имени пользователя-арендатора и использовать токены обновления для доступа к необходимым ресурсам. Как только я сделаю запрос на:
https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events
Моя заявка получила ответ 401
Из моего собрания кажется, что этот поток ограничен областью действия одного пользователя. Хотя администратор арендатора должен если у вас есть разрешение на просмотр любых ресурсов комнаты, технически комната сама является пользователем, поэтому API ответит запрещенной ошибкой. Теперь кажется, что должным образом администратор арендатора должен дать разрешение моему приложению, используя новый Сервис OAuth Flow.
Читая этот пост, кажется, что API использует OAuth тип предоставления учетных данных клиента (приложение только токены). Вместо использования /oauth/common
конечная точка, которую я теперь должен использовать /oauth/tenant-id
который я могу получить через токен JWT, возвращенный в code+id_token
тип ответа. Это приводит к моему первому вопросу:
Является ли использование потока OpenID единственным способом для первоначального получения идентификатора клиента?
Следующее — то, где вещи становятся немного неясными для меня.
Теперь нам нужно сгенерировать сертификат X.509 SSL и загрузить отпечаток пальца / значение в наш манифест приложения Azure. Достаточно просто.
Затем в соответствии с обсуждением в Office 365 Rest API — проверка подлинности недели демона мы создаем конкретный JWT, base64 кодируем его и подписываем его нашим сертификатом.
Я на самом деле не добрался до последних нескольких шагов здесь, но я опубликую свои результаты, когда смогу. Я просто проверяю, правильно ли я следую правильной процедуре доступа к ресурсам. Я знаю, что сервисные токены — это довольно новая функция, просто жаль, что мне пришлось искать поток отправки подписанного JWT в Stackoverflow, а не официальную документацию MSFT …
Я также заметил, что, поскольку мы используем поток учетных данных клиента, мы не получим refresh_token
в ответ. Итак, для моего последнего вопроса:
При доступе к разным ресурсам (например, API Graph / API Office365) я просто получаю разные маркеры доступа для каждого ресурса, используя мой подписанный запрос вместо использование токенов обновления для нескольких ресурсов?
Если общее направление, в котором я, кажется, иду, правильное, дайте мне знать! Любая помощь с благодарностью.
Поздно на вечеринку, но я тоже боролся за это, и вот что я нашел.
Маршрут 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) Если вы все сделали правильно, теперь у вас есть события для Вторичного пользователя!
Вы идете по правильному пути. Для каждого ресурса вам понадобится один токен, который предоставит вам доступ ко всем пользователям. Когда срок действия этого токена истечет, вы просто запросите новый.