如何在租户中查询所有用户日历的“暴露的Api”?

时间:2019-07-09 10:48:12

标签: azure oauth-2.0 azure-active-directory microsoft-graph microsoft-graph-calendar

我希望能够-从3月份的克罗恩工作开始。党的服务器-查询和修改我的租户(组织)日历中的所有用户-但是我最后得到的是我不知道该怎么做的“应用程序ID URI”。

无论我如何查询Microsoft graph API,我都会得到“无效的受众”,并且关于该主题的文档似乎并没有真正突出显示如何准确地指定正确的“受众”或实际上需要什么“资源”。 / p>

这些是我在Azure Active Directory门户中采取的步骤:

我使用“客户证书授予”流程,因此我可以使用Cron而不是通过用户进行访问。 https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

1)在门户中注册了一个应用程序。所以我得到了一些ID(在这里匿名)


Application (client) ID
:
51ed7b6d-d33e-491e
Directory (tenant) ID
:
c181f4f3-912b-4acf-
Object ID
:
3f52a799-f2ab-4161-a81c

2)创建了一个秘密,以便我可以提供该秘密以及Application ID以获取令牌。

3)向https://graph.microsoft.com/Calendars.ReadWrite授予“ Api应用程序权限”。

4)“暴露了Api”并将其范围称为“读写日历”,因此带有范围的应用程序ID URI最终为:api:// 51ed7b6d-d33e-491e-9d40-1 / readwritecalendars

5)使用步骤1中的“应用程序(客户端)ID”向应用程序授权API,因此我无需管理员同意即可进行查询。

问题现在我只是以“应用程序ID URI”结尾,好了,我该如何准确地查询日历呢?

我在这里使用https://github.com/TheNetworg/oauth2-azure

我能够成功获得令牌:

$provider = new \TheNetworg\OAuth2\Client\Provider\Azure([
            'clientId'     => env('OAUTH_APP_ID'),
            'clientSecret' => env('OAUTH_APP_PASSWORD'),
            'redirectUri'  => 'http://www.google.dk'
        ]);
        $provider->tenant = 'secret';
        $token = $provider->getAccessToken('client_credentials', [
            'resource' => 'https://graph.windows.net',
        ]);


        $provider->urlAPI = "https://graph.microsoft.com/v1.0/";
        $provider->resource = "https://graph.microsoft.com/";


return $token ; 

给我:

{
"token_type": "Bearer",
"ext_expires_in": "3600",
"expires_on": "1562669834",
"not_before": "1562665934",
"resource": "https://graph.windows.net/",
"access_token": "longstringofnumbers",
"expires": 1562269224
}

没有返回“ Aud”或“ Audience”字段。

这让我感到困惑,我到底如何形成链接,我怎么说我想用令牌查询所有日历?

查看前景图文档,它指定我需要这样查询(https://docs.microsoft.com/en-us/graph/api/user-list-calendars?view=graph-rest-1.0&tabs=http):

GET /me/calendars

这对我来说真的没有意义,因为“我”似乎暗示着一个用户,我正在尝试查询与特定用户无关的租户中的东西?

无论如何,如果我尝试查询:

$provider->get('me/calendars',$token);

或者我得到的不同组合:

Access token validation failure. Invalid audience.

总而言之:我如何实际查询API以列出/修改日历,我要打的实际端点是什么?我应该把实际查询放在哪里?

谢谢!

结果将是JSON对象而不是错误消息。成功返回查询。在这种情况下,所有用户日历的列表,或在修改日历后“成功更新”的列表。

2 个答案:

答案 0 :(得分:0)

在Azure AD中,您可以为应用程序注册指定“ API权限”。如果要使用一个访问令牌查询所有日历,则应使用“ Application permissions”。

第4点适用于其他类型的应用程序,例如Office加载项。

对于所有请求,您可以使用默认的Graph端点https://graph.microsoft.com/v1.0/。因此,如果您不想查询用户日历,则应使用以下代码:

GET https://graph.microsoft.com/v1.0/<UserId or UPN>/calendar

答案 1 :(得分:0)

可以使用:

$provider = new \TheNetworg\OAuth2\Client\Provider\Azure([
        'clientId'     => env('OAUTH_APP_ID'),
        'clientSecret' => env('OAUTH_APP_PASSWORD'),
    ]);
    $provider->tenant = env('AZURE_TENANT');
    $provider->urlAPI = "https://graph.microsoft.com/v1.0/";
    $provider->resource = "https://graph.microsoft.com/";
    $token = $provider->getAccessToken('client_credentials', [
        'resource' => 'https://graph.microsoft.com',
    ]);
    $currentCalendarEvents = $provider->get('users/some@some.com/calendars/Calendar/events?$top=1000', $token);

$ provider->资源和urlapi必须按照文档https://github.com/TheNetworg/oauth2-azure#microsoft-graph

中的要求进行设置。