Google My Business API - мне удалось отобразить все отзывы

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

Были предприняты следующие шаги, вы, возможно, знаете, мы должны выполнить некоторые предварительные условия, что я и сделал.

  1. Получив одобрение, я протестировал API через Google Oauth Playground и смог получить accoundId и locationId. (https://mybusiness.googleapis.com/v4/accounts/{accountId}/locations/{locationId}/reviews)

  2. Для реализации обзоров на сайте я использовал клиентскую библиотеку Google PHP (https://github.com/googleapis/google-api-php-client).

Теперь перейдем к основной части, чтобы получить все результаты, нам нужно добавить «токен доступа» в конце URL-адреса. (https://mybusiness.googleapis.com/v4/accounts/102xxxxxxx/locations/733xxxxxxx/reviews?access_token=xxxxxxxxxx)

Теперь проблема заключалась в том, что токен доступа истек через час, чтобы преодолеть это, я создал токен обновления и использовал следующий код. Хотя я не уверен, истечет ли когда-нибудь срок действия токена обновления?

      <?php
// include your composer dependencies
require_once 'GoogleClientApi/vendor/autoload.php'; // or wherever autoload.php is located

$refreshToken = 'xxxxxxxxxxxx'; // generrated from https://developers.google.com/oauthplayground/
$name = "accounts/xxxxxxx/locations/xxxxxxxx"; // generrated from https://developers.google.com/oauthplayground/

//PHP Client Library 
$client = new Google_Client();

$client->setClientId("xxxxxx"); // generated from Google Cloud Platform
$client->setClientSecret("xxxxx");  // generated from Google Cloud Platform
$client->refreshToken($refreshToken); // as set above in variable.

//Authorization Scopes
//$client->addScope("https://www.googleapis.com/auth/business.manage"); // Not needed probably.

$access_token = $client->getAccessToken(); // confused here...
$client->setAccessToken($access_token); // confused here..

$token = $access_token['access_token'];

$jsonDoc = file_get_contents("https://mybusiness.googleapis.com/v4/accounts/xxxxx/locations/xxxx/reviews?access_token=$token");

$array = json_decode($jsonDoc, true); // when true works as assoc array ?>

print_r($array) // output the JSON formatted reviews.

Теперь у меня возникли вопросы:

  1. Токен обновления, который я создал с помощью игровой площадки Googe OAuth, может истечь? Если да, мне нужно заново сгенерировать токен через Playground и вручную добавлять коды каждый раз в файл?
  2. Эти две строчки меня смущают. Следующий код генерирует новый токен доступа при каждом обновлении страницы. Это нормальный процесс? или это противоречит какой-либо политике Google, или я просто слишком много думаю?
      $access_token = $client->getAccessToken(); // confused here...
$client->setAccessToken($access_token); // confused here..
  1. Нужно ли мне хранить токен обновления или токен доступа в каком-либо файле или базе данных?

В настоящий момент возникает множество вопросов, но я думаю, что дальше лучше остановиться.

Я буду очень признателен, если кто-нибудь поможет мне встать на правильный путь.

Еще раз спасибо.

2 ответа

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

Если вы используете игровую площадку oauth2, токен обновления, вероятно, истечет довольно часто. Ведь детская площадка предназначена только для тестирования.

Вам следует подумать о создании однопользовательской системы. Код авторизуется, а затем токен обновления сохраняется в файле в следующем примере, который называется token.json.

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

      /**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('PHP Quickstart');
    $client->setScopes(Google_Service_Drive::BUSINESS.MANAGE);
    $client->setAuthConfig('credentials.json');
    $client->setAccessType('offline');


    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            // Request authorization from the user.
            $authUrl = $client->createAuthUrl();
            printf("Open the following link in your browser:\n%s\n", $authUrl);
            print 'Enter verification code: ';
            $authCode = trim(fgets(STDIN));

            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            // Check to see if there was an error.
            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;
}


// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Drive($client);

Несколько замечаний от меня.

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

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

У меня есть видео о процессе проверки, которое может помочь. Что нужно знать о проверке Google в 2021 году.

Для повторного создания токена доступа требуется токен обновления. Итак, вам нужно хранить токен обновления. Токен доступа истекает через один час, в то время как токен обновления никогда не истекает, вы можете получить токен доступа из токена обновления, когда вам нужно.

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