如何从Office REST API访问共享日历?

时间:2016-11-02 13:44:44

标签: azure calendar office365 microsoft-graph outlook-restapi

这个问题已被多次询问,并且根据this这样的答案,似乎API直到最近才支持这一点,因为here提到有新的范围允许访问共享日历。但它仍然无效。

我在两个平台上测试了这个:Azure和Microsoft Graph

  1. Azure广告应用
  2. 我在Azure AD中的应用程序具有所有必需的权限: enter image description here

    enter image description here enter image description here

    我将Office API v.1.0调用为:

      

    授权网址:

    https://login.microsoftonline.com/common/oauth2/authorize?client_id=%1$s&redirect_uri=%2$s&response_type=code
    
         

    令牌网址:https://login.microsoftonline.com/common/oauth2/token

         

    日历网址:https://outlook.office.com/api/v1.0/Me/Calendars

    它只为我提供了当前登录/授权用户创建的日历。

    由于这不起作用,我尝试使用API​​的第2版,但我得到以下内容:

    Additional technical information:
    Correlation ID: 7abf370a-d918-4514-bd74-cf5fc93fe3cf
    Timestamp: 2016-10-31 09:32:06Z
    AADSTS70001: Application 'f7571710-84e2-4444-8bfe-5eef92f4a46d' is not supported for this API version.
    

    所以我尝试使用Microsoft Graph Application

    1. Microsoft Graph App
    2. 我的应用程序还包含所有必需的权限。

      enter image description here

      我打电话给office API v2.0:

        

      授权网址:

      https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=%1$s&redirect_uri=%2$s&response_type=code&scope=%3$s
      
           

      范围是:

      private static $scopes = array(
          'https://outlook.office.com/calendars.read',
          'https://outlook.office.com/calendars.readwrite',
          'https://outlook.office.com/calendars.read.shared',
          'https://outlook.office.com/calendars.readwrite.shared',
      );
      
           

      令牌网址:   https://login.microsoftonline.com/common/oauth2/v2.0/token

           

      日历网址:   https://outlook.office.com/api/v2.0/Me/Calendars

      再次不给我共享的日历。

      感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

这里有很多东西:)但是,这里的关键似乎是你期望/Me/Calendars包含共享日历。它不是。要访问已共享的其他人日历,您必须通过/Users/<id>/Calendars/网址进行访问。

例如,如果bob@contoso.com登录,并且bill@contoso.com与他分享了他的日历,那么:

  • /Me/Calendars只能在Bob的邮箱中显示日历
  • /Users/bill@contoso.com/Calendars会显示Bill与Bob分享的日历

更新:我们这边似乎存在阻塞问题。我们正在努力。

答案 1 :(得分:1)

<强>更新。我找到了一个有效的解决方案。

GET / users('{id}')/ calendars('{id}')/ events

GET / me / calendars('{id}')/ events

有一些规则可供您分享,可在以下网址找到:https://developer.microsoft.com/en-us/graph/docs/concepts/known_issues#calendars

替代解决方法:

您可以使用API​​访问群组日历和群组活动。群组日历可以与组织内部或外部的任何人共享。您只需创建一个组,添加您想要读/写访问权限的任何成员,而不是共享用户日历。只要用户是该组的成员,添加到组日历的任何事件都将通过标准/ me / events GET请求来实现。

我发现您需要授予以下权限:

  • Calendars.Read(如果需要,则为Calendars.ReadWrite)
  • Calendars.Read.Shared(如果需要写,则为Calendars.ReadWrite.Shared)
  • Group.Read.All(如果需要,则为Group.ReadWrite.All)

祝你好运!

答案 2 :(得分:0)

我已经能够通过使用以下端点来执行我认为您正在询问的内容(使用Outlook API从已与Outlook日历共享的日历中获取事件):

.../api/v2.0/Users('PRIMARY_USER_ID')/Calendars('SHARED_CALENDAR_ID')/Events

从此端点,您应该能够从已与Outlook / Office 365帐户直接共享的任何日历中获取事件/信息。

  • 当您首次使用Outlook帐户登录并通过Microsoft的身份验证过程时,PRIMARY_USER_ID(正如我在此处所称的那样)会作为响应对象的一部分返回给您。这不是您尝试访问的日历的ID,而是与其他日历共享的主日历(您可以在api/v2.0/me端点找到的日历)的ID。我见过的所有ID都以一串字母和数字的形式返回。

  • CALENDAR_ID是您尝试从中获取事件的共享日历的ID。如果您向.../api/v2.0/me/calendars/发出请求,则可以为每个共享日历查看这些ID。这将返回与您共享的每个日历,有关所有者的信息以及该日历的“ID”。

如果您插入这些ID并向上面的网址发出请求,您应该能够从API获取日历事件。