Обновить токен в Googe Calendar API - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в Goole API.Я хотел бы использовать Google Calendar API на своем веб-сайте.Пользователи дают мне доступ, и я сохраняю access token в файле (например).

В течение дня задача CRON выполняет синхронизацию с календарями пользователей, извлекая ее.

Все работает нормально, кроме обновления доступа к токену.Вот мой код.

Для моего теста я храню access_token в харде.

<?php
require __DIR__ . '/../vendor/autoload.php';
session_start();

$redirect_uri = 'https://' . $_SERVER['HTTP_HOST'] . '/';
$client = new Google_Client();
$client->setClientId("aaaaaaa");
$client->setClientSecret("bbbbbbbb");
$client->setRedirectUri($redirect_uri);
$client->addScope("email");
$client->addScope(Google_Service_Calendar::CALENDAR);
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$client->setAccessType('offline');
$client->setRedirectUri('https://' . $_SERVER['HTTP_HOST'] . '/');

$service = new Google_Service_Oauth2($client);

if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
}

//var_dump($_SESSION['access_token']);
if (!isset($_SESSION['access_token']) || (isset($_SESSION['access_token']) && $_SESSION['access_token'] == "")) {
    //pour les tests
    echo "Come from database for example <br /><br />";
    $_SESSION['access_token'] = [
        "access_token" =>
            yyyyyyyy",
        "expires_in" =>
            3600,
        "scope" =>
            "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/plus.me",
        "token_type" =>
            "Bearer",
        "id_token" =>
            "xxxxxxxxxxxxx",
        "created" =>
            1538556145
    ];

    //Refresh
}

$client->setAccessToken($_SESSION['access_token']);
if ($client->isAccessTokenExpired()) {
    echo "<br/><h2>Refresh Token</h2><br />";
    // save refresh token to some variable
    $refreshTokenSaved = $client->getRefreshToken();

    // update access token
    $client->fetchAccessTokenWithRefreshToken($refreshTokenSaved);

    // pass access token to some variable
    $accessTokenUpdated = $client->getAccessToken();

    // append refresh token
    $accessTokenUpdated['refresh_token'] = $refreshTokenSaved;

    //Set the new acces token
    $_SESSION['access_token'] = $refreshTokenSaved;
    $client->setAccessToken($_SESSION['access_token']);
}

$calendar = new Google_Service_Calendar($client);
$calendarList = $calendar->calendarList->listCalendarList();

foreach ($calendarList->getItems() as $calendarListEntry) {
    echo $calendarListEntry->getSummary() . "<br>";
}

Если я жду задержки истечения срока действия токена, когда я нажимаю F5,У меня есть эта ошибка:

Неустранимая ошибка: Uncaught LogicException: токен обновления должен быть передан или установлен как часть setAccessToken в /xcxcxcxcxcxcxcxcxcxcxcx/vendor/google/apiclient/src/Gph/Client258 Стек трассировки: # 0 /xcxcxcxcxcxcxcxcxcxcxcx/quickstart.php(55): Google_Client-> fetchAccessTokenWithRefreshToken (NULL) # 1 {главный} бросили в /xcxcxcxcxcxcxcxcxcxcxcx/vendor/google/apiclient/src/Google/Client.php на линии 258

И я вижу, что $refreshTokenSaved - это NULL

Я что-то пропустил, но что?Спасибо

...