15

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

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

https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events

我的申请得到了回应401

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

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

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

接下来是事情对我来说有点模糊的地方。

我们现在必须生成 X.509 SSL 证书并将指纹/值上传到我们的 Azure 应用程序清单。很容易。

然后根据Office 365 Rest API - Daemon week authentication中的讨论,我们构建一个特定的 JWT,对其进行 base64 编码,并使用我们的证书对其进行签名。

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

我还注意到,由于我们使用的是客户端凭据流,因此我们不会refresh_token在响应中收到 a 。所以对于我的最后一个问题:

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

如果我的大致方向似乎是正确的,请告诉我!任何帮助是极大的赞赏。

4

2 回答 2

3

派对迟到了,但我也一直在为此奋斗,这就是我发现的。

进入 Office365 的 OAuth 路由仅允许您访问自己的日历。应用程序在 Azure 中拥有什么权限,或者您为每个用户配置什么并不重要。这是对 API 的限制。

MSFT 在对此 StackOverflow 问题的评论中证实了这一点:
Office365 API - 管理员访问另一个用户/房间的日历事件

但是,您可以使用基本身份验证来访问其他人的日历。

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) 如果您做对了所有事情,您现在就有了次要用户的事件!

于 2015-08-06T20:06:25.683 回答
2

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

于 2015-04-09T13:28:17.347 回答