不再能够使用服务帐户通过Google Calendar API访问共享日历

时间:2018-12-21 15:59:01

标签: php google-calendar-api

我有一个小型的php脚本,可以工作几个月,可以通过Google Calendar API创建和更新Google Calendar事件。它已经工作了2个月,然后突然停止工作,尽管我没有发现任何变化。

如果我将calendarId更改为“ primary”(这是服务帐户拥有的唯一真实日历),该代码仍然有效。因此,我知道代码本身在创建事件方面有效,只是无法访问共享日历以在这些日历上创建事件。这是我最初设置代码的方式以及尝试过的方法:

1)我创建了服务帐户并将其授予“所有者”角色。然后,我创建了密钥。 (请注意,这是我已启用“启用G Suite域范围委派”的GSuite帐户。)

2)对于需要使用该帐户管理的每个日历,我进入了日历共享设置(“与特定人员共享”),并添加了具有“进行更改并管理共享”权限的服务帐户“电子邮件”。

3)PHP脚本也是非常基本的,并使用最新版本的Google API PHP客户端库。它进行身份验证,然后可以创建一个事件(请注意,更改了一些详细信息,例如我的应用程序名称,以掩盖某些详细信息)。

require __DIR__ . '/vendor/autoload.php';

// Got the data and ready to authenticate
$client = new Google_Client();
$client->setApplicationName("MyAppName");
$client->setAuthConfig('credentials.json');
$client->setScopes([Google_Service_Calendar::CALENDAR_READONLY,Google_Service_Calendar::CALENDAR]);
$service = new Google_Service_Calendar($client);

// GATHER ALL PASSED IN DATA INTO VARIABLES
$calendarId = 'mycalendar@group.calendar.google.com';
$summary = "Test calendar entry";
$startDate = "2019-02-19";
$endDate = "2019-02-19";
$attendees = "user1@domain.com,user2@domain.com";

//Construct event array to send
$eventArray = array(
    'summary' => $summary,
    'start' => array(
        'date' => $startDate,
        'timeZone' => 'America/Chicago',
    ),
    'end' => array(
        'date' => $endDate,
        'timeZone' => 'America/Chicago',
    ),
    'guestsCanInviteOthers' => true,
    'guestsCanModify' => true,
    'guestsCanSeeOtherGuests' => true
);

//Only include attendees in event array if we find them
if ($data["attendees"]) {
    // Attendees are present
    $attendees = explode(",", $data["attendees"]);
    $attendeesArray = array();
    foreach ($attendees as $key => $value) {
        $attendeesArray[$key]['email'] = $value;
    };

    //Now add to original event array
    $eventArray["attendees"] = $attendeesArray;

}

//Create the event and return event id
$event = new Google_Service_Calendar_Event($eventArray);
$event = $service->events->insert($calendarId, $event);
$eventId = $event->id;
$createdDate = $event->created;

这可以验证OK,但是一旦您开始使用除“主要”以外的日历,就会出现错误:

Fatal error: Uncaught exception 'Google_Service_Exception' with message '{
    "error": {
    "errors": [
    {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found"
    }
    ],
    "code": 404,
    "message": "Not Found"
    }
}

我已经通过Google搜索,查看了本网站上的许多教程和建议,而我尝试过的所有事情(包括完全重置服务帐户)都无法解决问题。

1 个答案:

答案 0 :(得分:0)

我不确定Google是否更改了它的工作方式,或者我的IT是否弄乱了设置,因为我知道这已经有一段时间了。但是,我确实找到了解决方法!

必须更改另一个设置,该设置只能由GSuite管理员设置。步骤如下:

  1. 在您的Google管理控制台中(位于admin.google.com)...
  2. 转到应用程序> G Suite>日历。 (这需要具有“日历”>“设置”管理员权限。)
  3. 点击共享设置。
  4. 在“外部共享选项”部分中,选择“共享所有信息,外人可以更改日历”
  5. 如果我没记错的话,我什至不需要单击“保存”并且设置是即时的(无论是否有消息说可能要花点时间)。

在此处找到完整的详细信息-https://support.google.com/a/answer/60765?hl=en