Я работаю над примером, пытаясь узнать, как использовать Google Api для изменения событий в календаре. Сервер - это пользователь, который будет обновлять календарь на основе информации в базе данных. На самом деле взаимодействие с пользователем не требуется.Как настроить refresh_token при работе с google api?
Проблема в том, что у меня возникают проблемы с использованием/обновлением токенов. Я нажимаю «Connect Me» ссылку, которая добавляется к странице, и это дает мне ошибку:
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" }
У меня есть tried setting the refresh token this way, наряду с аналогичными методами, но ни один из них не похоже на работу, которая заставляет меня думать, Я реализую их неправильно.
Когда я распечатать переменную $_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 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('[email protected]');
$atendees = array($atendee);
$event->attendees = $atendees;
$service = new Google_Service_Calendar($client);
$event_id = $service->events->insert('primary', $event);
}
Как установить отсутствующий параметр: «refresh_token»? Существуют ли проблемы со структурой кода? Я просмотрел документацию, и я готов посмотреть еще кое-что, но если кто-то может пояснить, как это сделать, это было бы потрясающе. Благодаря!
Это замечательно, спасибо за объяснение. – DuckPuncher
Хорошо! Я думаю, проблема в том, что вы впервые получаете токен обновления. Если вы отмените авторизацию приложения и снова подключитесь, он будет там. – parthunberg