Мне нужно создать скрипт 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
Убедитесь, что вы прочитали https://developers.google.com/accounts/docs/OAuth2, а также соответствующую подстраницу (webapp, javascript и т. Д.) В зависимости от того, какой вкус вы используете. Вы не будете очень далеко отлаживать свое приложение, если не понимаете, что он делает.
Используйте Oauth Playground на странице https://developers.google.com/oauthplayground/, чтобы пройти через шаги Oauth и в конечном итоге сделать вызов API Google. Это подтвердит ваше понимание и покажет вам, как выглядят вызовы и ответы http
Используйте трассировку / протоколирование / прокси и т. Д., Чтобы отслеживать фактический трафик HTTP из вашего приложения. Сравните это с тем, что вы наблюдали на шаге 2. Это должно показать вам, где проблема.
Я получил эту ошибку раньше, потому что я пытался проверить подлинность дважды.
Поскольку у вас есть эта строка:
if (isset($_GET['code']))
Он попытается выполнить аутентификацию, когда код находится в строке запроса, независимо от того, вы уже прошли аутентификацию. Попробуйте проверить, присутствует ли токен SESSION перед попыткой (повторной) аутентификации.
Попробуйте удалить setDeveloperKey (), это вызвало некоторые проблемы для меня, и это кажется ненужным.