我想使用服务帐户访问Google日历。这是我的代码: <{1}}将替换为Google API控制台上的正确值。
<NUMBER>
当我执行我的代码时,我会收到:
致命错误:带有消息的未捕获异常'Google_AuthException' '刷新OAuth2令牌时出错,消息:'{“error”: “access_denied”}''in /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php:279 堆栈跟踪:#0 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php(256): Google_OAuth2-&gt; refreshTokenRequest(数组)#1 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php(209): Google_OAuth2-&gt; refreshTokenWithAssertion()#2 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/service/Google_ServiceResource.php(166): Google_OAuth2-&gt; sign(对象(Google_HttpRequest))#3 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/contrib/Google_CalendarService.php(154): Google_ServiceResource-&gt; __ call('list',Array)#4 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/testService.php(32): Google_CalendarListServiceResource-&gt; listCalendarList()#5 {main} 投入 /home/www/65683f67e3f0d94b14bba3c945014cda/web/intranet/googleapi/auth/Google_OAuth2.php 在第279行
如果我用以下代码更改我的代码:
<?php
require_once 'googleapi/Google_Client.php';
require_once 'googleapi/contrib/Google_CalendarService.php';
const CLIENT_ID = '<NUMBER>.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = '<NUMBER>@developer.gserviceaccount.com';
const MY_EMAIL = '<MY NAME>@gmail.com';
const KEY_FILE = 'privatekey.p12';
$client = new Google_Client();
$client->setClientId(CLIENT_ID);
$client->setApplicationName("<APP NAME>");
$key = file_get_contents(KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/calendar'),
$key,
'notasecret',
'http://oauth.net/grant_type/jwt/1.0/bearer',
MY_EMAIL)
);
$cal = new Google_CalendarService($client);
$calList = $cal->calendarList->listCalendarList();
print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";
我收到:
(403)未配置访问
这里出了什么问题?
答案 0 :(得分:3)
我有解决方案。 首先,好的代码是最后一个:
$client->setAssertionCredentials(new Google_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/calendar'),
$key));
问题不在于代码,而在于我的Google帐户,我在Google API控制台中提到了一个Referer。擦除字段后,代码可以正常工作。
如需信息,如果您想访问共享日历,请不要忘记与XXXXXX@developer.gserviceaccount.com(您的SERVICE_ACCOUNT_NAME)分享您的日历。
有关详细信息,请参阅:
https://groups.google.com/forum/?fromgroups=#!topic/google-ajax-search-api/kaKYuUstwB0/discussion