使用服务帐户在php上使用Google Calendar API

时间:2017-04-17 12:49:04

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

我对Google Calendar API有疑问。

我使用PHP获取Google Calendar API并使用服务帐户创建新事件。

如果我再次阅读php progrum上的日历,则只能加载从php写入服务帐户的日程表。

问题的原因是什么?

这是一个php无法在使用服务帐户从php创建的计划中读取的规范吗?

设置信息:

  1. 我正在使用google-api-php-client-1-master的autoload.php。

  2. 这是Google日历V3。

  3. 在日历ID中,共享电子邮件帐户(服务帐户)被赋予"日程表更改权限"并且可以写入日历。

  4. 可以通过php progrum读取所有者直接在Google日历上创建的日程安排,但无法加载php与服务帐户创建的日程安排。

  5. 我的代码

    //read event
    
    $json_path = '../json/XXXX-123465789.json';
    $json_string = file_get_contents($json_path, true);
    $json = json_decode($json_string, true);
    $private_key = $json['private_key'];
    $client_email = $json['client_email'];
    $scopes = array(Google_Service_Calendar::CALENDAR);
    $credentials = new Google_Auth_AssertionCredentials(
        $client_email,
        $scopes,
        $private_key
    );
    
    $client = new Google_Client();
    $client->setApplicationName("Google Calendar PHP API");
    $client->setAssertionCredentials($credentials);
    if ($client->getAuth()->isAccessTokenExpired()) {
        $client->getAuth()->refreshTokenWithAssertion();
    }
    $service = new Google_Service_Calendar($client);
    
    
    $read_start = mktime(0, 0, 0, 4, 10, 2017);
    $read_end = mktime(0, 0, 0, 4, 17, 2017);
    
    $calendarId = '123456789@group.calendar.google.com';
    $optParams = array(
        'maxResults' => 99,
        'orderBy' => 'startTime',
        'singleEvents' => TRUE,
        'timeMin' => date('c', $read_start_date),
        'timeMax' => date('c', $read_end_date),
    );
    
    $results = $service->events->listEvents($calendarId, $optParams);
    
    
    
    //create event
    
    $json_path = './json/xxx-123456789.json';
    $json_string = file_get_contents($json_path, true);
    $json = json_decode($json_string, true);
    
    $calendarId = '123456789@group.calendar.google.com';
    $private_key = $json['private_key'];
    $client_email = $json['client_email'];
    $scopes = array(Google_Service_Calendar::CALENDAR);
    $credentials = new Google_Auth_AssertionCredentials(
        $client_email,
        $scopes,
        $private_key
    );
    
    $client = new Google_Client();
    $client->setApplicationName("Google Calendar");
    $client->setAssertionCredentials($credentials);
    if ($client->getAuth()->isAccessTokenExpired()) {
            $client->getAuth()->refreshTokenWithAssertion();
    }
    $service = new Google_Service_Calendar($client);
    
    
    $meeting_end_time = _get_sum_time($set_time,$meeting_time);
    $event = new Google_Service_Calendar_Event(array(
        'summary' => 'created by service account',
        'start' => array(
            'dateTime' => '2017-04-04T00:12:00+09:00',
            'timeZone' => 'Asia/Tokyo',
        ),
        'end' => array(
            'dateTime' => '2017-04-04T00:13:00+09:00',
            'timeZone' => 'Asia/Tokyo',
        ),
    ));
    $event = $service->events->insert($calendarId, $event);
    

    但是,活动的创建者是根据服务帐户的地址创建的,而不是所有者的邮件帐户。

    你能告诉我这个答案吗?

1 个答案:

答案 0 :(得分:0)

您需要记住服务帐户不是您。将serice帐户视为虚拟用户。它有自己的谷歌日历帐户,自己的驱动器帐户,可能还有更多。当您在服务帐户上插入日历时,您将插入服务帐户拥有的日历中。

  

但是,活动的创建者是根据服务帐户的地址创建的,而不是所有者的邮件帐户。

活动的创建者是服务帐户应该是其创建活动的电子邮件帐户。

如果您希望特定用户添加事件,那么您应该使用Oauth2。