0

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

无论我如何查询 microsoft graph API,我都会得到“Invalid Audience”,而关于该主题的文档似乎并没有真正强调如何准确地指定正确的“audience”或“resource”实际上需要什么。

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

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

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


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

2)创建了一个秘密,因此我可以将其与应用程序 ID 一起提供以获取令牌。

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

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”字段。

这是我感到困惑的地方,我究竟如何形成一个链接,我怎么说我想用令牌查询所有日历?

查看它指定的 Outlook 图形文档,我需要像这样查询(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 对象而不是错误消息。成功返回查询。在这种情况下,所有用户日历的列表,或修改日历后的“成功更新”。

4

2 回答 2

0

In Azure AD you can specify "API Permissions" for an app registration. If you want to query all calendars with one access token you should use "Application permissions".

Point 4 is for other types of applications like Office Add-Ins.

For all request you can use the default Graph endpoint https://graph.microsoft.com/v1.0/. So if you wan't to query a user calendar you should use this:

GET https://graph.microsoft.com/v1.0/<UserId or UPN>/calendar
于 2019-07-09T14:16:55.610 回答
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->resource 和 urlapi 必须在请求关闭之前设置,如文档中所述:https ://github.com/TheNetworg/oauth2-azure#microsoft-graph

于 2019-07-10T19:17:45.193 回答