拒绝访问 Office 365 中的会议室日历 API

Access denied for Room Calendar in Office 365 API

我正在使用 Office 365 REST API 在 PHP 中编写一个应用程序,它可以下拉一个会议室的所有事件列表。我已经授权该应用程序,可以通过我的浏览器导航到 URL 来拉回房间事件列表,但是,一旦我尝试通过 CURL 发出请求,我就会得到以下信息响应。

{"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}

我的PHP如下

public function getCalendarEvents($token, $calendar) {

    $url = "https://outlook.office365.com/api/v1.0/users/$calendar/events";
    //$url = "https://outlook.office365.com/api/v1.0/me/events";

    $headers = array('Authorization: Bearer ' . $token, 'Content-Type: application/json', 'Accept:application/json');

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);

    $output=curl_exec($ch);

    $info = curl_getinfo($ch);
    //print_r($info['request_header']);

    curl_close($ch);
    print_r($output);
}

我试过将房间的电子邮件地址作为两者都传递

$url = "https://outlook.office365.com/api/v1.0/users/email@example.com/events";

$url = "https://outlook.office365.com/api/v1.0/Users('email@example.com')/Events";

这两个都不行。我可以使用

为自己撤回所有日历事件
$url = "https://outlook.office365.com/api/v1.0/me/events";

我是 Office 365 门户的管理员,并且被设置为拥有房间的完全权限。在我的研究中,我遇到了 this SO answer,但在 Azure 中取消选中此选项没有任何区别。

似乎报告了非常相似的问题here

您必须发送密码。 如果您的程序尝试多次可能会被作为垃圾邮件发送者阻止。

查看: http://support2.microsoft.com/kb/2630976

要解决此问题,请重置用户密码。为此,请按照下列步骤操作: 打开 Web 浏览器,浏览到 Office 365 门户 (https://portal.office.com),然后使用用户的过期凭据登录。 出现提示时,为用户输入新的 Office 365 密码。确保密码符合 Office 365 的标准。

目前,我们不支持经过身份验证的用户使用 OAuth 访问其他用户的邮件、日历或联系人。这就是为什么当您检索会议室的日历但使用您自己的日历时您的请求失败的原因。此请求使用浏览器有效,因为您使用的是基本身份验证,我们不建议您的应用程序这样做。如果您确实想尝试使用 OAuth 请求,您可以使用我们的 OAuth sandbox.

好消息是,我们即将发布对 OAuth 客户端凭据流的支持,这将使应用程序在租户管理员同意的情况下可以访问租户中的任何邮箱。由于您是租户管理员,一旦我们发布此功能,您将能够授权该应用程序访问租户会议室的日历。因此,请继续关注未来几周的公告。

[更新]: 现已支持服务帐户。请参阅我们的 blog announcement 了解更多详情,如果您有任何问题,请告诉我们。