Google Calendar API 出错 - 添加日历事件时需要 401 登录

Posted

技术标签:

【中文标题】Google Calendar API 出错 - 添加日历事件时需要 401 登录【英文标题】:Error with Google Calendar API - 401 Login required when adding a calendar event 【发布时间】:2012-03-21 05:26:21 【问题描述】:

当我使用 Codeigniter 和 Google apiService/apiCalendarService 开发导出和导入 Google 日历应用程序时。当我从这个页面向 Google 授权我的应用程序时,我已经完美地设置了一切,这没有问题:

包含的代码是发生重定向时发生的情况:

session_start();

require(APPPATH . 'libraries/google/apiClient.php');
require(APPPATH . 'libraries/google/contrib/apiCalendarService.php');

$apiClient = new apiClient();
$apiClient->setUseObjects(true);
$calendarService = new apiCalendarService($apiClient);

if(isset($_SESSION['oauth_access_token'])) 

    $apiClient->setAccessToken($_SESSION['oauth_access_token']);
 
else 

    $token = $apiClient->authenticate();
    $_SESSION['oauth_access_token'] = $token;

通过身份验证后,我会使用 URL 中的选项重定向回我的本地主机站点:

http://localhost/project/acp/sync/auth/?code=4/DS91JtSJ5_9Q-Z55Kpyh2AicyWdL

我的脚本将通过使用 authcode 查询字符串检查 URI 段来检测何时进行了身份验证 - 这样我就可以开始将事件导入我的 Google 日历帐户,直到我得到这个错误:

Fatal error: Uncaught exception 'apiServiceException' with message 'Error calling POST https://www.googleapis.com/calendar/v3/calendars/primary/events?key=removed API key: (401) Login Required' in /Users/Me/Sites/project/application/libraries/google/io/apiREST.php:86
Stack trace:
#0 /Users/Me/Sites/project/application/libraries/google/io/apiREST.php(56): apiREST::decodeHttpResponse(Object(apiHttpRequest))
#1 /Users/Me/Sites/project/application/libraries/google/service/apiServiceResource.php(187): apiREST::execute(Object(apiServiceRequest))
#2 /Users/Me/Sites/project/application/libraries/google/contrib/apiCalendarService.php(493): apiServiceResource->__call('insert', Array)
#3 /Users/Me/Sites/project/application/controllers/acp/panel.php(2053): EventsServiceResource->insert('primary', Object(Event))
#4 [internal function]: Panel->sync('auth')
#5 /Users/Me/Sites/project/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array)
#6 /Users/Me in /Users/Me/Sites/project/application/libraries/google/io/apiREST.php on line 86

导入事件的代码(代码来自 Google API 示例):

session_start();

require(APPPATH . 'libraries/google/apiClient.php');
require(APPPATH . 'libraries/google/contrib/apiCalendarService.php');

$apiClient = new apiClient();
$apiClient->setUseObjects(true);
$service = new apiCalendarService($apiClient);

$event = new Event();
$event->setSummary('Appointment');
$event->setLocation('Somewhere');
$start = new EventDateTime();
$start->setDateTime('2011-06-03T10:00:00.000-07:00');
$event->setStart($start);
$end = new EventDateTime();
$end->setDateTime('2011-06-03T10:25:00.000-07:00');
$event->setEnd($end);
$attendee1 = new EventAttendee();
$attendee1->setEmail('attendeeEmail');
// ...
$attendees = array($attendee1,
                   // ...
                  );
$event->attendees = $attendees;
$createdEvent = $service->events->insert('primary', $event);

echo $createdEvent->getId();

我尝试用谷歌搜索错误,但我似乎没有找到任何解决方案,你知道我该如何解决这个问题吗?

【问题讨论】:

你在哪里设置你的 developerKey? 我将它设置在您通常应该设置的config.php中。 哦,我看到你只是没有包含require_once "config.php";。那我就不知道了。 config.php 被包含在 apiService 类中。 【参考方案1】:

你得到一个401 Login Required,因为第二个代码没有设置令牌:

$apiClient->setAccessToken($_SESSION['oauth_access_token']);

【讨论】:

嗯,现在我得到一个不同的错误:Uncaught exception 'apiAuthException' with message 'Could not json decode the access token' 使用简单的echo $_SESSION['oauth_access_token']; 进行测试。必须是"access_token":"...","token_type":"...","expires_in"...。 Google 代码正在使用json_decode($accessToken, true); 来处理它。 var_dump 开始,NULL 似乎是 oauth_access_token 存在于数组中。 然后测试这一行:$token = $apiClient->authenticate(); $token 得到什么值? 成功了,我有一个错误:apiException' with message 'Cant add services after having authenticated'【参考方案2】:

OAuth with Google 无法在本地环境中运行。它必须是 Google 服务器可以访问以进行回调/OAuth 握手的 URL/IP 地址。

获取一个域并从那里进行测试,或者使用 DynDNS 或类似服务设置一个转发器。

【讨论】:

我做到了,我也在我的开发站点上测试过,它在那里也不起作用。 如果您使用浏览器登录,则密钥和令牌将通过会话返回到您的应用程序。您需要从 google 获取“localhost”的 API 密钥,但它会正常工作。

以上是关于Google Calendar API 出错 - 添加日历事件时需要 401 登录的主要内容,如果未能解决你的问题,请参考以下文章

Google 日历 API 范围 - calendar.readonly 和 calendar.events.readonly 之间有啥区别?

Google Calendar API 批量请求 PHP

ruby Google Calendar API - 事件删除

ruby Google Calendar API - 活动列表

从google-calendar-API获取详细信息,无需帐户关联

python Google Calendar API Python快速入门