2013-08-23 2 views
5

Хорошо, так вот что я хочу сделать ...Fetch Google Календарь событий на PHP сервер после аутентификации на IOS приложение

  1. пользователь санкционировал приложение на iPhone с чтения/доступа к календарю Google
  2. I написать получить токен аутентификации какого-то из Google
  3. Pass на маркер на мой PHP сервер и сохранить его в базе данных
  4. Используйте маркер, чтобы регулярно проверять на событиях Google и сохранять их в базе данных сервера
  5. Отправить на GOOG le events как json к приложению

Я хочу реализовать выборку событий Google на сервере, чтобы я мог создавать дополнительные функции вокруг них, например, отправлять удаленные push-уведомления.

Я застрял в части получения токена аутентификации и сохранил его на сервере и использовал его для извлечения событий из календаря Google api, не имея возможности найти ресурсы для них. Может кто-то пролить свет на это.


UPDATE

Я был в состоянии успешно реализовать сценарий до шага 3.

Я получаю токен аутентификации и обновления токенов от Google и сохранить его в базе данных. Теперь, используя Google API php client, я пытаюсь подключиться к API календаря Google, используя токен доступа, который я получил ранее. Я использую следующий код ...

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 Fatal error: Uncaught exception 'Google_AuthException' with message 'Could not json decode the token' in /myserver/application/libraries/Google/auth/Google_OAuth2.php:162

Stack trace: /myserver/application/libraries/Google/Google_Client.php(170): Google_OAuth2->setAccessToken('a_token...')

Я понимаю, что я сразу пытаюсь установить маркер доступа в клиентский API Google без указания любой URL-адрес перенаправления или другие параметры, обычно используемые, когда пользователь разрешает доступ к календарям Google на самом сервере. Должно ли это работать, как я пытаюсь?


UPDATE 2

После некоторого дальнейшего копания, я обнаружил, что непосредственно установив маркер доступа с использованием setAccessToken не работает как клиент Google для API ожидает JSON кодированные строки в методе setAccessToken. После некоторых настроек я изменил код на следующий ....

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.

Error refreshing the OAuth2 token, message: '{"error" : "invalid_request"}'

ответ

3

Наконец-то я могу ответить на свой вопрос. Надеюсь, это помогает кому-то другому.

Шаг 1 & 2. Я получил протокол Google OAuth, работающий в своем приложении iOS, в соответствии с инструкциями в this excellent tutorial on mobiletuts.

Шаг 3.Я сохранил токен доступа и обновил токен в базе данных на моем веб-сервере.

Шаг 4. С помощью токена обновления я получил от IOS App я подключен к Google Calendar 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); 
+0

Вы можете удалить две строки после вызова 'Google_Client :: refreshToken '. Комментарий в коде для этой функции: «Выбирает новый токен доступа OAuth 2.0 с данным токеном обновления», и в этом случае он устанавливает новый токен доступа в качестве текущего токена доступа для Клиента. – Jonathan

+0

... Кроме того, это не сработает, если вы не установите секрет клиента, а также идентификатор клиента, или я что-то не хватает? (N.B. И 'client_id', и' client_secret' могут быть установлены в/config файле для API API Google API.) – Jonathan

+0

@dvijaz - Спасибо за отзыв о токене доступа. Что касается 'client_secret', то код работает без установки' client_secret'. – vikmalhotra