google oauth2 / calendar getRefreshToken возвращает NULL - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь разрешить пользователям связывать свой календарь Google с моей системой, у меня он в основном работает, и какое-то время он работал, но пытаюсь внести некоторые изменения, он снова не работает: (

эта страница отправляет их в Google:

require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->setAccessType("offline");        // offline access
$client->setIncludeGrantedScopes(true);   // incremental auth
$client->addScope(Google_Service_Calendar::CALENDAR);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/sync/admin/apicomms/gcalmaster/syncFromGoogleCallback.php');
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Затем обратный вызов переходит сюда:

require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->setAccessType("offline");        // offline access
$client->setIncludeGrantedScopes(true);   // incremental auth
$client->addScope(Google_Service_Calendar::CALENDAR);
//$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/sync/admin/broadcast/syncFromGoogleCallback.php');
$client->authenticate($_GET['code']);

$refresh_token = $client->getRefreshToken();

var_dump($_GET);
var_dump($refresh_token);

На странице обратного вызова отображается

array(2) { ["code"]=> string(89) "x/xxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ["scope"]=> string(40) "https://www.googleapis.com/auth/calendar" } NULL

Так что похоже, что аутентификация проходит гладко, она не выдает никаких ошибок ...

Что мне не хватает, из-за чего я не получаю токен обновления? Я несколько раз проверил под https://myaccount.google.com/permissions, чтобы убедиться, что мое приложение не указано в списке.

EDIT:

У меня есть другой скрипт в моем приложении, который в данный момент работает, он выполняет фактическую синхронизацию, извлекает токен обновления из базы данных, получает с ним токен доступа и успешно извлекает события из календаря API. В данный момент не работает добавление новых календарей в мое приложение, процесс получения токена обновления от нового пользователя

$refreshToken = $db->execute('pull refresh token from db');
require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->fetchAccessTokenWithRefreshToken($refreshTokenFromDB);
$service = new Google_Service_Calendar($client);
$calendarId = 'primary';
$optParams = array(
    'timeMin' => date('c'),
);
$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) == 0) {
    print "No upcoming events found.\n";
} else {
    //loop through stuff
}

1 Ответ

0 голосов
/ 29 апреля 2018

Вы рядом.

Похоже, вы успешно получили код авторизации.

Затем с вашим кодом авторизации вы используете:

$client->authenticate($_GET['code']);  

Имейте в виду, что это не знак. Это код авторизации.

Теперь вам нужно запросить токен доступа, используя код авторизации.

$accessToken = $client->getAccessToken();

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

Итак, вы захотите сделать следующую строку:

 $refreshToken = $client->getRefreshToken();

Вы захотите безопасно сохранить эти токены в файле json где-нибудь в вашей системе, чтобы использовать их в следующий раз, когда вы захотите что-то сделать с этим календарем.

Поэтому, когда вы снова воспользуетесь этим, вы будете использовать $ accessToken, чтобы установить свои учетные данные с помощью Google. Если срок действия этого токена истек, вам придется использовать токен обновления, чтобы получить новый токен доступа. Я почти уверен, что токен обновления остается постоянным. Если нет, он будет отправлен с новым токеном доступа. Затем вы повторно сохраните файл JSON. Сполосните и повторите.

ОБНОВЛЕНО

Вы будете использовать:

$client->fetchAccessTokenWithRefreshToken($refresh_token);

Для получения нового токена доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...