Хорошо, так вот что я хочу сделать ...Fetch Google Календарь событий на PHP сервер после аутентификации на IOS приложение
- пользователь санкционировал приложение на iPhone с чтения/доступа к календарю Google
- I написать получить токен аутентификации какого-то из Google
- Pass на маркер на мой PHP сервер и сохранить его в базе данных
- Используйте маркер, чтобы регулярно проверять на событиях Google и сохранять их в базе данных сервера
- Отправить на 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"}'
Вы можете удалить две строки после вызова 'Google_Client :: refreshToken '. Комментарий в коде для этой функции: «Выбирает новый токен доступа OAuth 2.0 с данным токеном обновления», и в этом случае он устанавливает новый токен доступа в качестве текущего токена доступа для Клиента. – Jonathan
... Кроме того, это не сработает, если вы не установите секрет клиента, а также идентификатор клиента, или я что-то не хватает? (N.B. И 'client_id', и' client_secret' могут быть установлены в/config файле для API API Google API.) – Jonathan
@dvijaz - Спасибо за отзыв о токене доступа. Что касается 'client_secret', то код работает без установки' client_secret'. – vikmalhotra