Intereting Posts
Imagick не загружен в PHP Нулевой коалесцирующий оператор C # (?) В PHP? Как подключить Cakephp 1.3 с MS SQLServer 2008? Насколько безопасен код кодировки PHP bcompiler? Проверьте, существует ли ключ массива как другое значение массива Значения текстового поля Autofill из результата запроса mysql при изменении выпадающего списка в php Установите переменную среды в .htaccess и извлеките ее в PHP Кнопка блокировки AngularJS submit в форме symfony2 Изменение сайта Codeigniter с сайта http на https – не работает Отрицательные индексы php – array_fill mysql_result () ожидает, что параметр 1 будет ресурсом, данный объект Как эхо значения ассоциативного массива, возвращаемого функцией Каковы риски безопасности, позволяющие всем символам URL-адреса веб-сайта? Существуют ли какие-либо существенные причины для использования isset () над @ в php прерывистый «Попытка присвоить свойство не-объекта» по запросам / неспособность установить свойства объекта через $ this

Не удалось обновить токен OAuth2 в PHP, недействительный грант

Мне нужно создать скрипт PHP, который создает событие sigle в Календаре Google. У меня не возникало проблем с настройкой идентификатора клиента, секретности клиента, ключа разработчика и создания нового события.

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

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

Я получаю неперехваченное исключение «Google_AuthException» с сообщением «Ошибка обновления токена OAuth2, сообщение:« {«error»: «invalid_grant»

Я уже прочитал некоторые другие сообщения об этой теме здесь, в stackoverflow, но я до сих пор не нашел решение …: \

<?php require_once 'src/Google_Client.php'; require_once 'src/contrib/Google_CalendarService.php'; session_start(); $client = new Google_Client(); $client->setApplicationName("Calendar App"); $client->setClientId('xxxx'); $client->setClientSecret('yyy'); $client->setRedirectUri('http://www.zzzzzz'); $client->setDeveloperKey('kkk'); $client->setAccessType('offline'); $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'])) { //echo $_SESSION['token']; //$client->setAccessToken($_SESSION['token']); $authObj = json_decode($_SESSION['token']); $accessToken = $authObj->access_token; $refreshToken = $authObj->refresh_token; $tokenType = $authObj->token_type; $expiresIn = $authObj->expires_in; echo 'access_token = ' . $accessToken; echo '<br />'; echo 'refresh_token = ' . $refreshToken; echo '<br />'; echo 'token_type = ' . $tokenType; echo '<br />'; echo 'expires_in = ' . $expiresIn; } if(!empty($cookie)){ $client->refreshToken($this->Cookie->read('token')); } if ($client->getAccessToken()) { $calList = $cal->calendarList->listCalendarList(); $_SESSION['token'] = $client->getAccessToken(); } else { $authUrl = $client->createAuthUrl(); print "<a class='login' href='$authUrl'>Connect Me!</a>"; } // Creation of a single event $event = new Google_Event(); $event->setSummary($event_name); $event->setLocation(''); .... ?> 

Большое спасибо за вашу поддержку!

На этой странице https://developers.google.com/accounts/docs/OAuth2WebServer#offline объясняется, как работает токен обновления, и как использовать его для получения нового токена доступа с использованием raw http.

Из этого вопроса Как обновить токен с клиентом API Google? здесь есть php-эквивалент

 here is the snippet to set token, before that make sure the access type should be set to offline if (isset($_GET['code'])) { $client->authenticate(); $_SESSION['access_token'] = $client->getAccessToken(); } To refresh token $google_token= json_decode($_SESSION['access_token']); $client->refreshToken($google_token->refresh_token); this will refresh your token, you have to update it in session for that you can do $_SESSION['access_token']= $client->getAccessToken() 

ОТКЛЮЧЕНИЕ Следуйте этим трем шагам, чтобы отладить любое приложение oauth

  1. Убедитесь, что вы прочитали https://developers.google.com/accounts/docs/OAuth2, а также соответствующую подстраницу (webapp, javascript и т. Д.) В зависимости от того, какой вкус вы используете. Вы не будете очень далеко отлаживать свое приложение, если не понимаете, что он делает.

  2. Используйте Oauth Playground на странице https://developers.google.com/oauthplayground/, чтобы пройти через шаги Oauth и в конечном итоге сделать вызов API Google. Это подтвердит ваше понимание и покажет вам, как выглядят вызовы и ответы http

  3. Используйте трассировку / протоколирование / прокси и т. Д., Чтобы отслеживать фактический трафик HTTP из вашего приложения. Сравните это с тем, что вы наблюдали на шаге 2. Это должно показать вам, где проблема.

Я получил эту ошибку раньше, потому что я пытался проверить подлинность дважды.

Поскольку у вас есть эта строка:

if (isset($_GET['code']))

Он попытается выполнить аутентификацию, когда код находится в строке запроса, независимо от того, вы уже прошли аутентификацию. Попробуйте проверить, присутствует ли токен SESSION перед попыткой (повторной) аутентификации.

Попробуйте удалить setDeveloperKey (), это вызвало некоторые проблемы для меня, и это кажется ненужным.