使用 php 和服务帐户创建谷歌日历事件 - 身份验证问题

Posted

技术标签:

【中文标题】使用 php 和服务帐户创建谷歌日历事件 - 身份验证问题【英文标题】:Create google calendar events with php and service account - authenticate issue 【发布时间】:2013-12-18 08:32:33 【问题描述】:

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

我正在用 php 编写一个日历应用程序,并且我想在我的 google-calendar 中创建日历事件而无需用户操作(例如登录)。

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

我正在使用以下代码进行身份验证: (从这里下载: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->__call('list', Array) #3 /usr/www/users/leuchtk/html/i_termine_admin.php(55): Google_CalendarListServiceResource->listCalendarList() #4 /usr/www/users/leuchtk/html/termine_admin.php(113): include('/usr/www/users/...') #5 main 在第 66 行的 /usr/www/users/leuchtk/html/google-api/src/io/Google_REST.php 中抛出

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

马可

【问题讨论】:

【参考方案1】:

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

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

在你调用的地方

$client->setAssertionCredentials();

Google PHP Client API: Insufficient Permission

希望对你有帮助

【讨论】:

以上是关于使用 php 和服务帐户创建谷歌日历事件 - 身份验证问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Google 服务帐户编辑 Google 日历事件:403

使用 Nodejs 的服务帐户在谷歌日历中插入事件

未在服务帐户谷歌日历 api php 中创建环聊链接

与会者在使用服务帐户、谷歌日历 API 创建活动时未收到会议邀请

如何使用 android 使用日历 API 在谷歌日历上添加事件?

如何从单个谷歌帐户的多个谷歌日历中获取所有事件?