使用php和服务帐户创建Google日历活动 - 验证问题

时间:2013-12-02 15:15:07

标签: php google-calendar-api service-accounts

使用service-account-method时是否可以访问Google日历服务? 谷歌间接地说,这是不可能的,因为日历服务不在服务帐户方法文档的支持服务列表中,但我个人认为,这是可能的。 但是如何?

我正在用PHP编写一个日历应用程序,我想在没有用户操作(例如登录)的情况下在我的谷歌日历中创建日历事件。

我了解到,首先应用程序必须使用带有密钥文件的service-account-method对谷歌服务器进行身份验证.p12

我使用以下代码进行身份验证: (在这里下载:http://code.google.com/p/google-api-php-client/source/browse/trunk/examples/prediction/serviceAccount.php

session_start();
require_once 'google-api/src/Google_Client.php';
require_once 'google-api/src/contrib/Google_CalendarService.php';
require_once 'google-api/src/contrib/Google_PredictionService.php';


$client = new Google_Client();
$client->setApplicationName(GOOGLE_APPLICATION_NAME);
$client->setClientId(GOOGLE_CLIENT_ID);

$keyfile = file_get_contents(GOOGLE_KEY_FILE);

$client->setAssertionCredentials(new Google_AssertionCredentials(
  GOOGLE_SERVICE_ACCOUNT_NAME,
  array('https://www.googleapis.com/auth/prediction'),
  $keyfile)
);

但是这个登录似乎不起作用。 如果服务器当时登录,我怎么知道呢?

我想继续这样做:

$cal = new Google_CalendarService($client);
if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()) {
  $calList = $cal->calendarList->listCalendarList();  // <- this is line 55
  print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";

  $_SESSION['token'] = $client->getAccessToken();
} else {
  $authUrl = $client->createAuthUrl();
  print "<a class='login' href='$authUrl'>Connect Me!</a>";
}

但在第55行出现了这个错误:

  

致命错误:带有消息的未捕获异常'Google_ServiceException'   '调用GET时出错   https://www.googleapis.com/calendar/v3/users/me/calendarList :( 403)   “权限不足”   /usr/www/users/leuchtk/html/google-api/src/io/Google_REST.php:66

     

堆栈跟踪:#0   /usr/www/users/leuchtk/html/google-api/src/io/Google_REST.php(36):   Google_REST :: decodeHttpResponse(对象(Google_HttpRequest))   #1 /usr/www/users/leuchtk/html/google-api/src/service/Google_ServiceResource.php(186):   Google_REST ::执行(对象(Google_HttpRequest))   #2 /usr/www/users/leuchtk/html/google-api/src/contrib/Google_CalendarService.php(205):   Google_ServiceResource-&gt; __ call('list',Array)   #3 /usr/www/users/leuchtk/html/i_termine_admin.php(55):Google_CalendarListServiceResource-&gt; listCalendarList()   #4 /usr/www/users/leuchtk/html/termine_admin.php(113):include('/ usr / www / users / ...')   在第66行/usr/www/users/leuchtk/html/google-api/src/io/Google_REST.php中投放#5 {main}

所以看起来,应用程序没有登录。 我现在完全迷失在此代码中。 谢谢你的一些小亮点,那里缺少什么...

1 个答案:

答案 0 :(得分:0)

您可能想参考这个问题。您的问题可能只是添加

array('https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.readonly')

在你打电话的地方

$client->setAssertionCredentials();

Google PHP Client API: Insufficient Permission

希望这有帮助