Я пытаюсь разрешить пользователям связывать свой календарь 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
}






Вы близко.
Похоже, вам удалось получить код авторизации.
Затем с вашим кодом авторизации вы используете:
$client->authenticate($_GET['code']);
Имейте в виду, что это не токен. Это код авторизации.
Теперь вам нужно запросить токен доступа, используя код авторизации.
$accessToken = $client->getAccessToken();
Прошло некоторое время с тех пор, как я возился с этим, но я думаю, что это также ваш единственный раз, когда вы сможете запросить токен обновления.
Итак, вам нужно будет сделать следующую строку:
$refreshToken = $client->getRefreshToken();
Вы захотите безопасно сохранить эти токены в файле json где-нибудь в вашей системе, чтобы использовать их в следующий раз, когда вы захотите что-то сделать с этим календарем.
Поэтому, когда вы снова воспользуетесь этим, вы будете использовать $ accessToken для установки своих учетных данных в Google. Если срок действия этого токена доступа истек, вам придется использовать токен обновления, чтобы получить новый токен доступа. Я почти уверен, что токен обновления останется постоянным. В противном случае он будет отправлен с новым токеном доступа. Затем вы повторно сохраняете файл json. Промыть и повторить.
ОБНОВЛЕНО
Вы будете использовать:
$client->fetchAccessTokenWithRefreshToken($refresh_token);
Получить новый токен доступа.
К какому календарю вы пытаетесь получить доступ
Возможно, вам потребуется войти в этот календарь, удалить разрешения для вашего API и повторить попытку.
Я использую свой личный для тестирования, убедился, что снял разрешения
Соблюдается ли поток OAuth2. то есть, вы будете перенаправлены на страницу учетной записи Google, где у вас спрашивают разрешения. Вы нажимаете "Да", это перенаправляет вас обратно на страницу вашего сайта? Это происходит?
@ Келли Ларсен, я вижу твое обновление. Итак, вы входите на свой сайт и пытаетесь добавить свой личный календарь. Когда вы пытаетесь добавить календарь, он перенаправляет вас на страницу Google, где он просит вас разрешить вашему api доступ к вашему календарю. Вы нажимаете «Да», а затем он перенаправляет вас на другую страницу вашего сайта. Происходит ли вообще этот процесс?
да, этот процесс работает, запуск первого блока кода переводит меня на страницу, где перечислены мои текущие авторизованные учетные записи Google. при нажатии на один из них отображается страница с сообщением «myserver.co.nz хочет получить доступ к вашей учетной записи Google [email protected]. Это позволит myserver.co.nz управлять вашими календарями». щелчок по разрешению возвращает меня на страницу обратного вызова, где я получаю код авторизации в виде переменной $ _GET, но попытка получить доступ и обновить токены просто дает мне NULL
Не могу найти способ написать вам в личку, поэтому я просто напишу здесь, я наконец понял это, лол! Я переместил файлы и обновил setRedirectUri на первой странице с '/sync/admin/broadcast/syncFromGoogleCallback.php' на '/sync/admin/apicomms/gcalmaster/syncFromGoogleCallback.php', но не обновил его. на странице обратного вызова (DO'OH!) Странно, что он не выдавал ошибку ... Да ладно, это работает, еще раз спасибо за время, которое вы потратили на помощь :)
Эй, без проблем. В любом случае для меня было хорошо пересмотреть код Google. Я бы солгал тебе, если бы сказал, что никогда не делал того же самого. Я рад, что вы это поняли. Удачи в остальной части проекта. Ваше здоровье!
Я добавил
$accessToken = $client->getAccessToken();чуть выше моей строки$refresh_token = $client->getRefreshToken();, но оба они отображаются как NULL, когда я их var_dump. Кажется, у меня все еще есть проблема с апстримом