我正在尝试构建一个可以访问所有组织日历(用户,房间等)的应用程序。
目前,我的身份验证流程将代表租户用户登录,并使用刷新令牌来访问所需的资源。我一提出要求就提出:
https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events
我的应用程序以401
从我的聚会来看,这个流程似乎仅限于单个用户的范围。虽然租户管理员应该有权查看任何房间资源,但该房间在技术上是用户本身,因此API将以禁止的错误进行响应。现在似乎正确的流程是租户管理员必须使用新的Service OAuth Flow授予我的应用程序权限。
阅读这篇文章似乎API正在使用OAuth client credentials grant type(仅限应用令牌)。我现在不得不使用/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
。所以对于我的最后一个问题:
访问不同的资源(即图谱API / Office365 API)时,我是否只使用已签名的请求而不是using refresh tokens for multiple resources为每个资源获取了不同的访问令牌?
如果我似乎正在进行的总体方向是正确的,请告诉我!非常感谢任何帮助。
答案 0 :(得分:3)
晚会,但我也一直在争吵,这就是我发现的。
进入Office365的OAuth路由只允许您访问自己的日历。无论应用程序在Azure中具有哪些权限,或每个用户配置的权限。这是对API的限制。
MSFT在对StackOverflow问题的评论中证实了这一点:
Office365 API - Admin accessing another users/room's calendar events
但是,您可以使用基本身份验证来访问其他人的日历。
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)如果你已经做好了一切,你现在可以为次要用户做好事件了!
答案 1 :(得分:2)
您正走在正确的道路上。每个资源需要一个令牌,这将授予您对所有用户的访问权限。当该令牌到期时,您只需申请一个新令牌。