Как правильно подключить вторую «статическую» учетную запись Azure Office365 без входа в систему (учетные данные уже предоставлены)?

Компания, в которой я работаю, очень крупная, в ней работает более 5000 человек. Поэтому у нас есть лицензии на Azure, и все наши электронные письма и серверы работают на их платформе. Я создал приложение для нашего внутреннего бизнеса (интранет). Это приложение использует SSO для входа в систему наших пользователей и блокировки внешних пользователей, которые не входят в наш клиент. Правление обратилось ко мне с вопросом, можем ли мы использовать одну глобальную учетную запись электронной почты для управления всеми событиями компании и объявлениями через календарь. Я искал некоторое время (3 недели) и не смог найти ничего, связанного с тем, что я собираюсь сделать (на PHP).

Мне нужно соединение с Microsoft Graph через php, которое автоматически регистрирует «статически» заданный адрес электронной почты и выдает все события календаря между двумя датами. Microsoft Graph API полон предварительных версий этого, но все они написаны для «общедоступных» адресов электронной почты, а не для более безопасных адресов Azure.

У меня установлено соединение с токеном Bearer, но по умолчанию оно возвращается с истекшим сроком действия.

Что у меня есть до сих пор:

$tenantAppUrl = "https://login.microsoftonline.com/“.$tenantid;
$tenantHostUrl = "login.microsoftonline.com”;
$requesturl = "https://login.microsoftonline.com/“.$tenantid."/oauth2/token?api-version=1.6”;

$post_params = array(
   "client_id" => $clientid,
   "client_secret" => $clientsecret,
   "resource" => "https://graph.windows.net/",
   "grant_type" => "client_credentials"
);
$headers = array(
   "POST: " . $tenantAppUrl . " HTTP/1.1",
   "Content-Type: application/x-www-form-urlencoded",
   "Host: " . $tenantHostUrl,
   "cache-control: no-cache",
   'Content-Length: ' . strlen(json_encode($post_params))
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $fullurl);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_params);
$response = json_decode(curl_exec($curl), false);

curl_close($curl);

Приведенное выше возвращает токен Bearer, срок действия которого истек 2 часа назад.

HTTP/1.1 100 Continue HTTP/1.1 200 OK Cache-Control: no-cache, no-store Pragma: no-cache Content-Type: application/json; charset=utf-8 Expires: -1 Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff x-ms-request-id: 2f26979b-c336-44a3-a9c9-d4d785758c00 P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" Set-Cookie: fpc=AsIZpMH6undMozQVDrbmPxTWEVd_AQAAAEeKP9QOAAAA; expires=Fri, 10-May-2019 06:55:04 GMT; path=/; secure; HttpOnly Set-Cookie: x-ms-gateway-slice=prod; path=/; secure; HttpOnly Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly Date: Wed, 10 Apr 2019 06:55:03 GMT Content-Length: 1448 

{"token_type":"Bearer","expires_in":"3599","ext_expires_in":"3599","expires_on":"1554882904","not_before":"1554879004","resource":"https://graph.windows.net/","access_token”:”<thetoken>"}

Я ожидаю, что токен Bearer должен быть действителен не менее 2 часов, но вместо этого он возвращает срок действия 2 часа назад.

Почему срок действия этого токена истек и как мне использовать протокол «обновить»/«JWT» в php, чтобы продлить срок его использования до 1 месяца или более?

Имейте в виду, что в эту учетную запись никто не войдет. Это должно происходить автоматически. (учетные данные были (безопасно) сохранены в среде администрирования интрасети).

И как получить все события календаря между двумя датами для учетных записей Azure? Приведенный ниже URL-адрес также описан для «общедоступных адресов электронной почты».

https://docs.microsoft.com/en-us/graph/api/calendar-list-calendarview?view=graph-rest-1.0


person Dustin Beijersbergen v H.    schedule 10.04.2019    source источник
comment
Вы можете настроить время жизни токена от 1 часа по умолчанию до 2 часов, а максимум для токена доступа — 1 день. Дополнительные сведения см. в разделе здесь.   -  person SunnySun    schedule 10.04.2019
comment
Хм... я попробую, но не использовать ли мне токен обновления? Когда я открываю приложение @ portal.azure.com, я вижу, что у меня уже есть +20 новых токенов, созданных этим кодом :-).   -  person Dustin Beijersbergen v H.    schedule 10.04.2019
comment
Я не могу заставить эту powershell работать (macOS или Windows). Я действительно думаю, что мне нужен протокол JWT   -  person Dustin Beijersbergen v H.    schedule 10.04.2019


Ответы (1)


Чтобы определить время жизни токена, можно использовать значения параметров expires_in или expires_on, согласно документация:

  • expires_in Срок действия токена доступа (в секундах)
  • expires_on Время истечения срока действия токена доступа. Дата представлена ​​в виде количества секунд от 1970-01-01T0:0:0Z UTC до истечения срока действия. Это значение используется для определения времени жизни кэшированных токенов.

В вашем примере ответ от конечной точки /token сообщает, что срок действия токена истекает через 3599 секунд или в 2019-04-10 07:55:04 (в формате UTC по дизайну)

Чтобы получить локальное время истечения срока действия, установите DateTime::setTimezone (Список поддерживаемых часовых поясов), как показано на рисунке. ниже:

$expiredOn = DateTime::createFromFormat( 'U', $token->expires_on, new DateTimeZone('UTC'));
$expiredOn->setTimeZone(new DateTimeZone('Europe/Helsinki'));
person Vadim Gremyachev    schedule 16.04.2019