Google Calendar PHP API - 致电POST的致命错误

时间:2013-09-05 03:46:09

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

首次尝试将Google Api用于带有服务帐户的日历,我发现是否有不同的答案我可以使用Calendar API的服务帐户。

是否有人可以评论他们是否已成功将Google Calendar API与服务帐户结合使用?如果有,您是否还可以发布一些将事件插入日历的示例代码?

我已经浏览了我的Google Apps帐户中的所有先决条件步骤,以便访问我的API项目,我已经下载了我的P12密钥...只是在使用服务帐户时遇到问题。

更新 - 2013年9月5日

我已经使用以下代码取得了一些成功,但是只有在我将带有权限的clientID直接添加到我在Google Apps中的日历时才能使用它,这不是我想要完成的。我需要通过管理控制面板中的API访问权限区域获得Google Apps管理员授予权限,才能插入日历。

用例信息:

我正在开发一个Web应用程序,它会根据用户的SMTP地址将事件插入到Google Apps日历中。没有提示进行身份验证,这个过程对用户来说是无缝的...所以这基本上是我一直在阅读的服务帐户模型的用例。

我有一段代码正常工作,但是只有我将我的API中的ClientID添加到我的日历的安全设置中才能获得全部权限。我需要通过让Google Apps域管理员授予我的应用程序权限来插入日历,他们在管理员>安全>高级设置>管理API客户端访问权限下的管理第三方设置上执行此操作。

根据我将ClientID添加到指定用户的Google Apps日历安全性中的代码:

<?php

    /* THIS IS THE PATH TO THE GOOGLE LIBRARIES
    */
    require_once '../assets/google-api-php-client/src/Google_Client.php';
    require_once '../assets/google-api-php-client/src/contrib/Google_CalendarService.php';

    define('SERVICE_ACCOUNT_NAME', 'XXXXXXXXXXX@developer.gserviceaccount.com');
    define('CLIENT_ID','XXXXXXXX-nt292r9jftv56jh9g5hvcob8od8is182.apps.googleusercontent.com');
    define('KEY_FILE', 'XXXXXXXXXX123e906b6340d2ccba173225c55-privatekey.p12');
    define('CALENDAR_ID','USER@GOOGLEAPPSDOMAIN.com');

    $client = new Google_Client();
    $client->setApplicationName("My Application Name");
    $client->setClientId(CLIENT_ID);

    /* Note: make sure to call $client->setUseObjects(true) if you want to see
     * objects returned instead of data (this example code uses objects)
     */
    $client->setUseObjects(true);

    /*session_start();
    if (isset($_SESSION['token'])) {
     $client->setAccessToken($_SESSION['token']);
    }
    */
    /* Load the key in PKCS 12 format - remember: this is the file you had to
     * download when you created the Service account on the API console.
     */
    $key = file_get_contents(KEY_FILE);


    $cred = new Google_AssertionCredentials(
        SERVICE_ACCOUNT_NAME,
        array('https://www.googleapis.com/auth/calendar'),
        $key);
    $client->setAssertionCredentials($cred);


    if (isset($_SESSION['token'])) {
     $client->setAccessToken($_SESSION['token']);
    }

    /* ------------------------- We are now properly authenticated ------------------- */

    $cal = new Google_CalendarService($client);

    date_default_timezone_set('America/New_York');
    $start = date(DATE_ATOM,strtotime('now'));
    $end = date(DATE_ATOM,strtotime('+1 month'));

    $params = array(
        'singleEvents' => 'true',
        'timeMax' => $end,
        'timeMin' => $start,
        'orderBy' => 'startTime');

    $event_list = $cal->events->listEvents(CALENDAR_ID, $params);

    $events = $event_list->getItems();
    echo '<table border="1"><thead>';
    echo '<th>ID</th><th>SAFE</th><th>Start</th><th>End</th></tr></thead>';
    foreach ($events as $event) {
    echo '<tr>';
    //echo '<td>'.$event->getId().'</td>';
    echo '<td>'.$event->getSummary().'</td>';
    echo '<td>'.$event->getStart()->getDateTime().'</td>';
    echo '<td>'.$event->getEnd()->getDateTime().'</td>';
    echo '</tr>';
    }
    echo '</table>';

    ?>

谢谢! 约什

1 个答案:

答案 0 :(得分:1)

正如您所提到的,第一步是让Google Apps域管理员授予您对服务帐户的ClientID的域范围授权,对于日历读/写范围, { {3}}

之后,创建 Google_AssertionCredentials 对象,并将对象的 sub 设置为您要写入其日历的用户的电子邮件地址。假设 mydomain.com 是您的服务帐户被授予权限的域:

$client = new Google_Client();
$client->setApplicationName("Calendar Service Account Test");

$key = file_get_contents(<path_to_your_key>);
$auth = new Google_AssertionCredentials (
  <service_account_email>,
  'https://www.googleapis.com/auth/calendar',
  $key);
$auth->sub = 'account@mydomain.com';
$client->setAssertionCredentials($auth);
$calendar = new Google_CalendarService($client);

您现在可以在 account@mydomain.com 的日历中编写一个类似以下内容的活动:

$event = new Google_Event();
$event->setSummary('Appointment');
$event->setLocation('Somewhere');
$start = new Google_EventDateTime();
$start->setDateTime('2013-09-07T10:00:00.000-07:00');
$start->setTimeZone('America/Los_Angeles');
$event->setStart($start);
$end = new Google_EventDateTime();
$end->setDateTime('2013-09-07T10:25:00.000-07:00');
$end->setTimeZone('America/Los_Angeles');
$event->setEnd($end);
$attendee1 = new Google_EventAttendee();
$attendee1->setEmail('myguest@example.com');
$event->attendees = array($attendee1);

$calendar->events->insert('primary', $event);