使用服务帐户访问用户日历

时间:2014-11-07 13:51:30

标签: google-calendar-api google-api-php-client

我的Intranet上有一个php应用程序需要在我的用户的日历中添加事件。

我遵循以下指示 https://developers.google.com/+/domains/authentication/delegation

我设置了google-api-php客户端,并使用示例service-accounts.php作为我的起点。

$client_id = 'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.apps.googleusercontent.com';
$service_account_name = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy@developer.gserviceaccount.com';
$key_file_location = 'file.p12';

$client = new Google_Client();
$client->setApplicationName("egw - intranet");
$service = new Google_Service_Calendar($client);
//authenticate
if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/calendar'),
    $key
);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();

$event = new Google_Service_Calendar_Event();
$event->setSummary('API V3 TEST');
$event->setLocation('rrrrrrrrrrrrrrrrrrrrrrrrr');
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2014-11-03T10:00:00.000-07:00');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2014-11-04T10:25:00.000-07:00');
$event->setEnd($end);
$attendee1 = new Google_Service_Calendar_EventAttendee();
$attendee1->setEmail('email@domain.com');

$attendees = array($attendee1);
$event->attendees = $attendees;
$createdEvent = $service->events- >insert('email2@domain.com', $event);

echo $createdEvent->getId();

我收到404找不到错误。 如果我手动共享我用于服务帐户测试的日历,它可以正常工作。但我希望我的程序能够在不手动共享所有用户的每个日历的情况下工作。有人能告诉我我错过了什么吗?

亲切的问候,

2 个答案:

答案 0 :(得分:0)

您无法将活动添加到尚未与您的Google项目明确共享的日历中。您必须与服务帐户共享每个日历,或者必须将OAuth2与Web应用程序凭据一起使用,以便每个用户都可以访问您。

答案 1 :(得分:0)

当我开始这个时,当前客户端google-php-api-client是1.1.0-beta。几周后,我们现在是1.1.2。升级到此版本解决了我的问题。 添加服务帐户使应用程序可以通过Google识别自己。 如果您像我一样将范围添加到Google管理控制台,则服务帐户可以访问范围为域中的每个用户指定的所有数据。 谢谢所有回复。