Php Office365 API-访问其他用户/房间';日历

Php Office365 API-访问其他用户/房间';日历,php,oauth,office365,exchangewebservices,outlook-restapi,Php,Oauth,Office365,Exchangewebservices,Outlook Restapi,我正在尝试构建一个可以访问组织所有日历(用户、会议室等)的应用程序 当前,我的身份验证流将代表租户用户登录,并使用刷新令牌访问所需资源。一旦我要求: https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events 我的申请被回复为401 从我收集的信息来看,这个流似乎仅限于单个用户的范围。虽然租户管理员应该有权查看任何房间资源,但从技术上讲,房间本身就是用户,因此API将以禁止的错误进行响应。现在看来,正确的流

我正在尝试构建一个可以访问组织所有日历(用户、会议室等)的应用程序

当前,我的身份验证流将代表租户用户登录,并使用刷新令牌访问所需资源。一旦我要求:

https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events
我的申请被回复为
401

从我收集的信息来看,这个流似乎仅限于单个用户的范围。虽然租户管理员应该有权查看任何房间资源,但从技术上讲,房间本身就是用户,因此API将以禁止的错误进行响应。现在看来,正确的流程是租户管理员必须使用新的

通读这篇文章,API似乎在使用OAuth(仅应用程序令牌)。我现在必须使用
/oauth/common
端点,而不是使用
/oauth/tenant id
,我可以通过
code+id\u令牌
响应类型中返回的JWT令牌检索该端点。这引出了我的第一个问题:

使用OpenID流是最初检索租户ID的唯一方法吗?

下一步是事情变得有点模糊

我们现在必须生成一个X.509 SSL证书,并将指纹/值上载到Azure应用程序清单。很简单

然后根据中的讨论,我们构建了一个特定的JWT,base64对其进行编码,并使用我们的证书进行签名

我实际上还没有到最后几步,但我会在可能的时候发布我的结果。我只是想确保我在尝试访问哪些资源时遵循了正确的程序。我知道服务令牌是一个相当新的功能,只是不幸的是,我不得不在Stackoverflow上找到发送签名JWT的流程,而不是官方MSFT文档

我还注意到,由于我们使用的是客户端凭据流,因此在响应中不会收到
刷新\u令牌。最后一个问题是:

当访问不同的资源(即Graph API/Office365 API)时,我是否只是使用已签名的请求为每个资源获取不同的访问令牌,而不是?


如果我要走的方向是正确的,请告诉我!非常感谢您的帮助。

您走的是正确的道路。每个资源需要一个令牌,这将授予您对所有用户的访问权。当该令牌过期时,您只需申请一个新令牌。

派对迟到了,但我也一直在努力解决这个问题,以下是我的发现

OAuth路由到Office365将只允许您访问自己的日历。不管应用程序在Azure中拥有什么权限,也不管您为每个用户配置了什么。这是对API的限制

MSFT在对该StackOverflow问题的评论中确认了这一点:

但是,您可以使用Basic Auth访问另一个人的日历

1) 配置“主要”用户(您进行身份验证的用户)以访问“次要”用户(具有您要查看的日历的用户)帐户。要执行此操作,请转到辅助用户的Exchange属性->邮箱委派,并授予主用户完全访问权限

2) 将身份验证与请求一起传递给Office365 API:

<?php
$username = 'primary@user.com';
$password = 'mypass';
$URL = 'https://outlook.office365.com/api/v1.0/users/secondary@user.com/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) 如果你做的一切都是对的,那么你现在就拥有了第二用户的事件

你能看看我的问题吗?我也定了一份赏金。非常感谢!