在iOS应用上进行身份验证后,在PHP服务器上获取Google Calendar事件

时间:2013-08-23 03:03:09

标签: php ios authentication google-calendar-api

好的,这就是我想要做的......

  1. 用户授权iPhone上的应用程序具有对Google日历的读/写权限
  2. 我从Google
  3. 获得某种身份验证令牌
  4. 将令牌传递给我的PHP服务器并将其保存在数据库中
  5. 使用令牌定期检查Google事件并将其存储在服务器的数据库中
  6. 将Google事件数据作为json发送到应用
  7. 我想在服务器上实现Google事件的获取,以便我可以围绕它们构建其他功能,例如发送远程推送通知。

    我被困在获取身份验证令牌并将其保存在服务器上并使用它从Google的日历api中获取事件,但无法找到相同的资源。有人可以对此有所了解。


    更新

    我已经能够成功实施该方案直到第3步。

    我从Google获取身份验证令牌并刷新令牌并将其保存在数据库中。现在使用Google API php client,我正在尝试使用我之前获得的访问令牌连接到Google的日历API。我使用以下代码...

    require_once(APPPATH . "libraries/Google/Google_Client.php");
    require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");
    
    $client = new Google_Client();
    $client->setAccessToken($google_access_token);
    
    $calendar = new Google_CalendarService($client);
    $calendarList = $calendar->calendarList->listCalendarList();
    echo print_r($calendarList, true);
    

    但现在我收到了这个错误...

      

    PHP致命错误:未捕获异常'Google_AuthException'   消息'无法json解码令牌'   /myserver/application/libraries/Google/auth/Google_OAuth2.php:162

         

    堆栈跟踪:   /myserver/application/libraries/Google/Google_Client.php(170):Google_OAuth2-> setAccessToken('a_token ...')

    我了解到,我直接尝试在Google客户端api中设置访问令牌,而不指定任何重定向网址或用户授权访问服务器本身上的Google日历时通常使用的其他参数。这应该像我一样努力吗?


    更新2

    经过进一步挖掘,我发现使用setAccessToken直接设置访问令牌不起作用,因为API的Google客户端需要setAccessToken方法中的JSON编码字符串。经过一些调整后,我将代码更改为以下....

    require_once(APPPATH . "libraries/Google/Google_Client.php");
    require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");
    
    $client = new Google_Client();
    $client->setAccessType('offline');
    $client->refreshToken($google_refresh_token);
    $newToken = $client->getAccessToken();
    $client->setAccessToken($newToken);
    
    $calendar = new Google_CalendarService($client);
    $calendarList = $calendar->calendarList->listCalendarList();
    echo print_r($calendarList, true);
    

    现在我得到的错误是invalid_request

      

    刷新OAuth2令牌时出错,消息:'{“error”:“invalid_request”}'

1 个答案:

答案 0 :(得分:3)

最后,我能够回答我自己的问题。希望这有助于其他人。

第1步& 2.我按照this excellent tutorial on mobiletuts中的说明在我的iOS应用程序中使用了Google OAuth协议。

步骤3.我在网络服务器上的数据库中保存了访问令牌和刷新令牌。

步骤4.使用我从iOS App I获得的刷新令牌,使用此代码连接到Google日历API ...

require_once(APPPATH . "libraries/Google/Google_Client.php");
require_once(APPPATH . "libraries/Google/contrib/Google_CalendarService.php");

/* setup google client object */
$client = new Google_Client();
$client->setClientId(GOOGLE_CLIENT_ID);

/* refresh access token */
$client->refreshToken($google_refresh_token);
$newToken = $client->getAccessToken();
$client->setAccessToken($newToken);

/* get google calendars list */
$calendar = new Google_CalendarService($client);
$calendarList = $calendar->calendarList->listCalendarList();
echo print_r($calendarList, true);