Как установить refresh_token при работе с google api?

Я работаю над примером, пытаясь узнать, как использовать google api для изменения событий в календаре. Сервер – это пользователь, который будет обновлять календарь на основе информации в базе данных. На самом деле взаимодействие с пользователем не требуется.

Проблема в том, что у меня возникают проблемы с использованием / обновлением токенов. Я нажимаю ссылку «Подключить меня», которая добавляется на страницу, и это дает мне ошибку:

Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: '{ "error" : "invalid_request", "error_description" : "Missing required parameter: refresh_token" }

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

Когда я распечатываю переменную $_SESSION['access_token'] , она не показывает refresh_token :

{"access_token":"token","token_type":"Bearer","expires_in":3599,"created":1417534503}

Вот функция, которую я использую для авторизации «пользователя» без части refresh_token (основанной на примере):

 function googleAuth(){ $client_id = 'myclientid'; $client_secret = 'myclientsecret'; $redirect_uri = 'redirecturi'; $client = new Google_Client(); $client->setAccessType('offline'); $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setRedirectUri($redirect_uri); $client->setScopes('https://www.googleapis.com/auth/calendar'); /************************************************ If we're logging out we just need to clear our local access token in this case ************************************************/ if (isset($_REQUEST['logout'])) { unset($_SESSION['access_token']); } /************************************************ If we have a code back from the OAuth 2.0 flow, we need to exchange that with the authenticate() function. We store the resultant access token bundle in the session, and redirect to ourself. ************************************************/ if (isset($_GET['code'])) { $resp = $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } /************************************************ If we have an access token, we can make requests, else we generate an authentication URL. ************************************************/ if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); } else { $authUrl = $client->createAuthUrl(); } if (isset($authUrl)) { echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>"; } return $client; } с function googleAuth(){ $client_id = 'myclientid'; $client_secret = 'myclientsecret'; $redirect_uri = 'redirecturi'; $client = new Google_Client(); $client->setAccessType('offline'); $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setRedirectUri($redirect_uri); $client->setScopes('https://www.googleapis.com/auth/calendar'); /************************************************ If we're logging out we just need to clear our local access token in this case ************************************************/ if (isset($_REQUEST['logout'])) { unset($_SESSION['access_token']); } /************************************************ If we have a code back from the OAuth 2.0 flow, we need to exchange that with the authenticate() function. We store the resultant access token bundle in the session, and redirect to ourself. ************************************************/ if (isset($_GET['code'])) { $resp = $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } /************************************************ If we have an access token, we can make requests, else we generate an authentication URL. ************************************************/ if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); } else { $authUrl = $client->createAuthUrl(); } if (isset($authUrl)) { echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>"; } return $client; } 

Вот код, который я использую, чтобы добавить событие в календарь:

 function addEvent($title, $location, $startTime, $stopTime, $client){ $event = new Google_Service_Calendar_Event(); $start = new Google_Service_Calendar_EventDateTime(); $event->setSummary($title); $event->setLocation($location); $start->setDateTime($startTime); $end = new Google_Service_Calendar_EventDateTime(); $end->setDateTime($stopTime); $event->setStart($start); $event->setEnd($end); $atendee = new Google_Service_Calendar_EventAttendee(); $atendee->setEmail('someGuy@someDomain.com'); $atendees = array($atendee); $event->attendees = $atendees; $service = new Google_Service_Calendar($client); $event_id = $service->events->insert('primary', $event); } время function addEvent($title, $location, $startTime, $stopTime, $client){ $event = new Google_Service_Calendar_Event(); $start = new Google_Service_Calendar_EventDateTime(); $event->setSummary($title); $event->setLocation($location); $start->setDateTime($startTime); $end = new Google_Service_Calendar_EventDateTime(); $end->setDateTime($stopTime); $event->setStart($start); $event->setEnd($end); $atendee = new Google_Service_Calendar_EventAttendee(); $atendee->setEmail('someGuy@someDomain.com'); $atendees = array($atendee); $event->attendees = $atendees; $service = new Google_Service_Calendar($client); $event_id = $service->events->insert('primary', $event); } 

Как я могу установить отсутствующий параметр: «refresh_token»? Существуют ли проблемы со структурой кода? Я просмотрел документацию, и я готов посмотреть еще кое-что, но если кто-то может пояснить, как это сделать, это было бы потрясающе. Благодаря!

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

Что-то вроде этого

  $token = $client->getAccessToken(); $authObj = json_decode($token); if(isset($authObj->refresh_token)) { save_refresh_token($authObj->refresh_token); } 

Где save_refresh_token сохраняет ваш токен обновления где-нибудь (db).

Затем вы можете проверить, совпадает ли токен с:

  $client->isAccessTokenExpired() 

Если это так, вы можете обновить его с помощью:

 $client->refreshToken($your_saved_refresh_token); 

А затем установите новый токен доступа на сеанс:

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