gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как сделать авторизацию в Google Spreadsheets на PHP?

Довольно долго долбаюсь над документацией гугла, но так и не удалось сложить правильной картины о том, как оно работает и тем более объяснить - почему.

Прошу помощи - мне нужно получается чтобы при запросе к скрипту он получал права на запись и считывание таблицы в массив. В общем-то у меня получилось считать и записать. Из браузера. Но вот автоматический токен из скрипта не получается, а каждый раз его вручную обновлять - ну не может быть чтобы гуглы такое сделали.

Раздельные понятия:
1. аккаунт Гугла
2. аккаунт Google Api

Как я понял оно работает:
1. Создаем аккаунт гугла на любую почту
2. В настройках создаем сервисный аккаунт для Google Api
3. Там же создаем еще один аккаунт Google Api и там выбираем web-приложение
4. Скачиваем client_secret.json
5. Ставим либу от google `google-api-php-client-2.1.1`
6. Из этой либы пишем вот такой код:
// config
  $client_secret_fpath = '<fpath to client_secret.json>';
  $client_secret = json_decode(file_get_contents($client_secret_fpath), true);

  // process
  // init client
  $client = new Google_Client();
  $client->setAuthConfig($client_secret_fpath);
  $client->addScope(Google_Service_Sheets::SPREADSHEETS);
  $client->setIncludeGrantedScopes(true);
  $client->setAccessType('offline');

7. Проверяем токен в файле или в сессии, где удобно
$token_fpath = __DIR__ . '/token.ini';
  if (!is_file($token_fpath) || (!$access_token = json_decode(file_get_contents($token_fpath), true))):
    $auth_url = $client->createAuthUrl();
    // ... стопэээээ, ни curl, ни wget не спасут, redirect делать нельзя, т.к. терминал
  endif;


Вот тут я теряюсь:
Сгенерированная ссылка - КЛИЕНТСКАЯ. Если на нее перейдет браузер - она работает и дает токен в ответ, после нажатия кнопки "Разрешить" в стандартной форме от гугла же.
Но, при всем своем великолепии - PHP не может НАЖАТЬ эту кнопку, он просто выдает контент страницы вместо редиректа с кодом.

Как тут быть?

Ну и потом...
9. Сохранить токен в файл
10. Поставить проверку токена на истечение срока действия, и сделать запрос на revoke() когда это произойдет...
  • Вопрос задан
  • 1688 просмотров
Решения вопроса 1
gzhegow
@gzhegow Автор вопроса
aka "ОбнимиБизнесмена"
Получилось.
Для того, чтобы получать доступ с другого компьютера (без участия пользователя) - созданы т.н. сервисные аккаунты. Когда мы создаем такой аккаунт - Гугл предупреждает, что `credentials` будут созданы в единственном экземпляре и их недопустимо "потерять".

Таким образом нужно использовать в скрипте:
$client_secret_fpath = __DIR__ . 'service-account-credentials.json';
$client->setAuthConfig($client_secret_fpath);


А поскольку в этом файлике зашит приватный ключ - получение разрешения на пользование не требуется вообще.
Не забудьте расшарить доступ к таблице ли или другому сервису на сервисный емейл (он тоже есть в файле-ключе сервисного аккаунта).
===

А вот если мы создаем доступ как "веб-приложение" - то это не значит что мы с сервера можем подключиться к аккаунту, это означает что "сайт сможет использовать возможность спросить пользователя о разрешении", таким образом "токен" у гугла является однозначным идентификатором разрешения человека, и требует нажатия кнопки "разрешить".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы