无需登录(已提供凭据)即可连接第二个"静态"Azure Office365 帐户的正确方法是什么?



我工作的公司是一家非常大的公司,拥有5000+名员工。因此,我们拥有 Azure 许可证,所有电子邮件和服务器都在他们的平台上运行。 我已经为我们的内部业务(内部网)构建了一个应用程序。此应用程序使用 SSO 登录我们的用户并阻止不在我们的租户中的外部用户。董事会来找我,询问我们是否可以使用一个全球电子邮件帐户通过日历管理所有公司活动和公告。我已经搜索了一段时间(3 周),找不到与我将要做的事情(在 PHP 中)相关的任何内容。

我需要通过 php 与 microsoft graph 建立连接,它会自动记录"静态"给定的电子邮件地址,并吐出 2 个日期之间的所有日历事件。Microsoft graph api 充满了这方面的预览,但它都是为"公共"电子邮件地址编写的,而不是更安全的 Azure 电子邮件地址。

我使用持有者令牌设置了连接,但默认情况下返回已过期。

到目前为止,我有什么:

$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);

上面返回 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>"}

我希望一个不记名令牌应该至少有效 2 小时,但它返回的是 2 小时前过期的,而不是那个。

为什么此令牌已过期,如何使用 php 中的"续订"/"JWT"协议将其使用时间延长至 1 个月或更长时间?

请记住,任何人都不会登录此帐户。它需要自动发生。(凭据已(安全)保存在 Intranet 管理环境中)。

如何获取 Azure 帐户 2 个日期之间的所有日历事件?下面的 URL 还针对"公共电子邮件地址"进行了描述。

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

要确定令牌生存期,可以使用expires_inexpires_on参数值,每个文档:

  • expires_in访问令牌的有效期(以秒为单位)
  • expires_on访问令牌过期的时间。日期表示为从 UTC1970-01-01T0:0:0Z到过期时间的秒数。此值用于确定缓存令牌的生存期。

在您的示例中,来自/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'));

最新更新