2014-12-02 4 views
2

Я работаю над примером, пытаясь узнать, как использовать 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»? Существуют ли проблемы со структурой кода? Я просмотрел документацию, и я готов посмотреть еще кое-что, но если кто-то может пояснить, как это сделать, это было бы потрясающе. Благодаря!

ответ

5

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

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

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

Где save_refresh_token экономит ваше обновления-маркер где-то (дБ).

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

$client->isAccessTokenExpired() 

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

$client->refreshToken($your_saved_refresh_token); 

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

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

Это замечательно, спасибо за объяснение. – DuckPuncher

+0

Хорошо! Я думаю, проблема в том, что вы впервые получаете токен обновления. Если вы отмените авторизацию приложения и снова подключитесь, он будет там. – parthunberg

Смежные вопросы