Google oauth2 / calendar getRefreshToken возвращает NULL

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

Обновлено:

В моем приложении есть еще один скрипт, который в настоящее время работает, он выполняет фактическую синхронизацию, извлекает токен обновления из базы данных, получает с его помощью токен доступа и успешно извлекает события из 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
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
612
1

Ответы 1

Вы близко.

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

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

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

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

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

$accessToken = $client->getAccessToken();

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

Итак, вам нужно будет сделать следующую строку:

 $refreshToken = $client->getRefreshToken();

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

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

ОБНОВЛЕНО

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

$client->fetchAccessTokenWithRefreshToken($refresh_token);

Получить новый токен доступа.

Я добавил $accessToken = $client->getAccessToken(); чуть выше моей строки $refresh_token = $client->getRefreshToken();, но оба они отображаются как NULL, когда я их var_dump. Кажется, у меня все еще есть проблема с апстримом

Kelly Larsen 29.04.2018 09:17

К какому календарю вы пытаетесь получить доступ

Joseph_J 29.04.2018 09:18

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

Joseph_J 29.04.2018 09:19

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

Kelly Larsen 29.04.2018 09:22

Соблюдается ли поток OAuth2. то есть, вы будете перенаправлены на страницу учетной записи Google, где у вас спрашивают разрешения. Вы нажимаете "Да", это перенаправляет вас обратно на страницу вашего сайта? Это происходит?

Joseph_J 29.04.2018 09:26

@ Келли Ларсен, я вижу твое обновление. Итак, вы входите на свой сайт и пытаетесь добавить свой личный календарь. Когда вы пытаетесь добавить календарь, он перенаправляет вас на страницу Google, где он просит вас разрешить вашему api доступ к вашему календарю. Вы нажимаете «Да», а затем он перенаправляет вас на другую страницу вашего сайта. Происходит ли вообще этот процесс?

Joseph_J 29.04.2018 09:33

да, этот процесс работает, запуск первого блока кода переводит меня на страницу, где перечислены мои текущие авторизованные учетные записи Google. при нажатии на один из них отображается страница с сообщением «myserver.co.nz хочет получить доступ к вашей учетной записи Google [email protected]. Это позволит myserver.co.nz управлять вашими календарями». щелчок по разрешению возвращает меня на страницу обратного вызова, где я получаю код авторизации в виде переменной $ _GET, но попытка получить доступ и обновить токены просто дает мне NULL

Kelly Larsen 29.04.2018 09:33

Не могу найти способ написать вам в личку, поэтому я просто напишу здесь, я наконец понял это, лол! Я переместил файлы и обновил setRedirectUri на первой странице с '/sync/admin/broadcast/syncFromGoogleCallback.php' на '/sync/admin/apicomms/gcalmaster/syncFromGoogleCallback.php'‌, но не обновил его. на странице обратного вызова (DO'OH!) Странно, что он не выдавал ошибку ... Да ладно, это работает, еще раз спасибо за время, которое вы потратили на помощь :)

Kelly Larsen 04.05.2018 11:14

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

Joseph_J 05.05.2018 09:01

Другие вопросы по теме