Невозможно получить токен Google OAuth

Я пытаюсь добавить события календаря в свой календарь Google из скрипта php. Обратите внимание, что я могу сделать это успешно прямо со страницы Google поэтому я думаю, что мой календарь настроен правильно. Однако, когда я пытаюсь сделать это из скрипта php, я не могу получить токен OAuth2.

Следующий скрипт, в основном взятый из примера Google, выполняется без ошибок, но всегда заканчивается сообщением «Подключи меня!». ссылка. Когда я нажимаю на эту ссылку, я попадаю на экран проверки, который предупреждает меня, что это приложение хочет управлять моими календарями. Я нажимаю «Принять», а затем просматриваю свой календарь. Немного неудобно, но если он получает токен OAuth, прекрасно.

Затем я возвращаюсь и снова запускаю сценарий, надеясь, что токен доступа теперь будет доступен, но я получаю точно такой же результат. Сколько бы раз я ни запускал этот скрипт, я никогда не получаю токен, который мне нужен для расширения скрипта для добавления событий в календарь.

Я занимаюсь этим несколько дней, и я просто никуда не денусь. Кто-нибудь может помочь? Спасибо.

<?php
require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_CalendarService.php';
require_once '../../src/auth/Google_OAuth2.php';

session_start();

$client = new Google_Client();
$client->setApplicationName("Add Google Calendar Entries");

// Visit https://code.google.com/apis/console?api=calendar to generate your
// client id, client secret, and to register your redirect uri.
$client->setClientId('843319906820-1s1d737e77o71a3vaskf434k3ape1fk5.apps.googleusercontent.com');
$client->setClientSecret('AP5imn3e0TEWNyLTCNm8YJj6');
$client->setRedirectUri('https://www.google.com/calendar/');
$client->setDeveloperKey('AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-uc');
$client->setUseObjects(true);

$cal = new Google_CalendarService($client);

if (isset($_GET['logout'])) {
  unset($_SESSION['token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
  $calList = $cal->calendarList->listCalendarList();
  print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";

  $_SESSION['token'] = $client->getAccessToken();

} else {
  $authUrl = $client->createAuthUrl();
  print "<a class='login' href='$authUrl'>Connect Me!</a>";
}

?>

РЕДАКТИРОВАТЬ: попытка реализовать предложение Винисиуса Пинто. Я изменил свое перенаправление, чтобы указывать прямо на этот скрипт. Теперь я получаю такую ​​ошибку:

Неустранимая ошибка: неперехваченное исключение 'Google_ServiceException' с сообщением 'Ошибка при вызове GET https://www.googleapis.com/calendar/v3/users/me/calendarList?key=AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-: (403) Доступ не настроен. Пожалуйста, используйте Google Developers Console, чтобы активировать API для своего проекта ». в D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ io \ Google_REST.php: 66 Трассировка стека: # 0 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php -client \ src \ io \ Google_REST.php (36): Google_REST :: decodeHttpResponse (Object (Google_HttpRequest)) # 1 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ service \ Google_ServiceResource .php (186): Google_REST :: execute (Object (Google_HttpRequest)) # 2 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ contrib \ Google_CalendarService.php (205): Google_ServiceResource- > __ call ('list', Array) # 3 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ examples \ calendar \ simple.php (43): Google_CalendarListServiceResource-> listCalen в D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ io \ Google_REST.php в строке 66

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

РЕДАКТИРОВАТЬ 2: Похоже, я использовал неправильный ключ разработчика. Поменял на ключ для серверных приложений. Теперь моя ошибка такова:

Неустранимая ошибка: неперехваченное исключение 'Google_AuthException' с сообщением 'Ошибка обновления токена OAuth2, сообщение:' {"error": "invalid_client"} '' в D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ auth \ Google_OAuth2.php: 288 Трассировка стека: # 0 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ auth \ Google_OAuth2.php (248): Google_OAuth2-> refreshTokenRequest ( Array) # 1 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ auth \ Google_OAuth2.php (225): Google_OAuth2-> refreshToken ('1 / 6ZdJyZALqcbwW ...') # 2 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ service \ Google_ServiceResource.php (167): Google_OAuth2-> sign (Object (Google_HttpRequest)) # 3 D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ contrib \ Google_CalendarService.php (205): Google_ServiceResource -> __ call ('list', Array) # 4 D: \ Hosting \ 11347607 \ html \ scripts \ google-api- php-client \ examples \ calendar \ simple.php (47): Google_CalendarListServiceResource-> listCalendarList () в D: \ Hosting \ 11347607 \ html \ scripts \ google-api-php-client \ src \ auth \ Google_OAuth2.php в строке 288


person AndroidDev    schedule 17.03.2014    source источник


Ответы (1)


$client->setRedirectUri() должен получить URL-адрес, указывающий на ваше приложение, потому что это URL-адрес, на который вы будете перенаправлены после авторизации приложения на странице Google. Вот почему вы перенаправляетесь на календарь, потому что вы используете URL-адрес календаря.

Похоже, ваш скрипт уже ожидает $ _GET ['code'], поэтому попробуйте установить URL-адрес перенаправления на URL-адрес этого скрипта. Вам также необходимо установить тот же URL-адрес в консоли разработчика в разделе API -> Учетные данные.

Вы получаете токен только тогда, когда вызываете $client->authenticate($_GET['code']); с кодом значения.

Взгляните на эту библиотеку, которую я только что добавил на Github, это ранняя версия, но она работает нормально (я использую для доступа к YouTube). Он использует новую официальную библиотеку.

Обновление: как сказано в комментариях, ключ разработчика на самом деле не требуется для того, чтобы это работало, даже если его устанавливает весь пример кода Google.

person Vinicius Pinto    schedule 18.03.2014
comment
Спасибо, @ViniciusPinto. Я изменил это перенаправление и теперь получаю сообщение об ошибке 403 о том, что API-интерфейсы не активированы. Если у вас хватит на это терпения (а мне жаль!), Пожалуйста, посмотрите правку, которую я опубликовал. Возможно, это так же просто, как включить другой API, но я не знаю, какой из них ему нужен, кроме API Календаря, который уже активирован. Еще раз спасибо. Я очень ценю это! - person AndroidDev; 18.03.2014
comment
Я думаю, что для этого требуется только Calendar API, скрипт у меня работает нормально. Дважды проверьте свои учетные данные и убедитесь, что вы используете учетные данные для правильного проекта. Я не уверен, в чем еще может быть проблема. - person Vinicius Pinto; 18.03.2014
comment
Я проверял их снова и снова. Есть несколько вариантов, которые мне нужно сделать (например, использовать ли я ключ для серверных приложений или ключ для приложений браузера), которые я могу ошибаться. Я временно включил снимок экрана всей моей консоли разработчика для этого проекта. Это всего лишь тестовые данные, и я создам заново эти ключи, а снимок экрана удалю позже. Не могли бы вы взглянуть на это и увидеть, не упускаю ли я чего-нибудь? Спасибо еще раз. Вы спасаете жизнь. - person AndroidDev; 18.03.2014
comment
ключ разработчика должен быть ключом API в разделе Ключ для серверных приложений. - person Vinicius Pinto; 18.03.2014
comment
Еще раз спасибо. Я внес это изменение. У меня немного другая ошибка, которую я считаю прогрессом. Есть еще несколько сообщений об этой ошибке, но нет ответов. Я думаю, что я почти у цели. Есть какие-нибудь мысли, как это исправить? Ненавижу беспокоить тебя, но я не могу найти ответов. Спасибо. - person AndroidDev; 18.03.2014
comment
хм, я не уверен, но вы пробовали очистить файлы cookie? похоже, что он пытается использовать токен, который находится в вашем сеансе, и который был создан с неправильными учетными данными ... - person Vinicius Pinto; 18.03.2014
comment
Я понял. Наконец-то. Ваше предложение об очистке файлов cookie помогло мне преодолеть эту ошибку, но возникла другая. Я смог найти решение, которое окончательно решило все. Оказывается, окончательным решением было удаление любых ссылок на ключ разработчика. Я отмечу ваш ответ как решение, но, ради других, не могли бы вы обновить часть об удалении ключа разработчика, если вы согласны с этим? Еще раз спасибо за вашу помощь! Без тебя не справился бы. - person AndroidDev; 18.03.2014
comment
большой! Я не знал, что ключ разработчика не требуется, в документации написано, что вы должны его установить. Я добавил примечание к ответу. - person Vinicius Pinto; 19.03.2014