Google PHP SDK не меняет Accesstoken на setAccessToken - PullRequest
1 голос
/ 23 июня 2019

Я создаю небольшой инструмент для управления несколькими местоположениями GMB одновременно, но я столкнулся с проблемой с google php api клиентом .

Я получаю маркеры доступа нескольких пользователей / местоположений из своей базы данных и хочу обновить их в цикле, но клиент gp php api не изменяет используемые маркеры доступа в своих запросах на использование setAccesstoken для второй раз.

При каждом запуске цикла после первого будет использоваться токен доступа с первого запуска, даже если getAccesstoken() вернет правильный токен доступа. похоже, что внутренне используемый GuzzleClient не обновляется для использования нового токена для следующих запросов.

К сожалению, я не смог найти способ заставить SDK обновить GuzzleClient или воссоздать его. Я надеюсь, что вы можете помочь мне.

 foreach($this->getLocationsToUpdate() as $location){

    $oldAccessToken = $this->google->getClient()->getAccessToken();

    $placeData = $this->places->getFullPathAndToken($location);
    if($placeData !== null){

        try{
            //only sets the token correct on the first run.
            $this->google->setAccessToken($placeData['access_token']);

            $this->updateReviews($placeData);
            $this->updateQuestions($placeData);
            $this->updateMedia($placeData);

             // returns the correct token, but api requests in the methods above fail, since the auth header from the guzzle requests still use the token from the first run.
            var_dump($this->google->getClient()->getAccessToken());

            $this->google->setAccessToken($oldAccessToken);

        }catch(\Exception $e){                   
            $this->google->setAccessToken($oldAccessToken);
        }

    }

}

EDIT: Я сделал еще один пример, чтобы удалить все переменные из моего собственного кода. Запрос 1 работает нормально, запрос 2 не выполняется, потому что он все еще использует $token1, если я удаляю запрос 1, запрос 2 работает нормально.

<?php

define('BASE_DIR', dirname(__FILE__));

require_once BASE_DIR.'/vendor/autoload.php';

$token1 = '.....';
$token2 = '.....';

$name1 = 'accounts/115224257627719644685/locations/12065626487534884042';
$name2 = 'accounts/115299736292976731655/locations/295582818900206145';


$client = new \Google_Client();
$client->setAuthConfig(BASE_DIR.'/Config/Google/credentials.json');
$client->setRedirectUri('https://...../login/callback.html');
$client->setAccessType("offline");
$client->setPrompt('consent');
$client->addScope(\Google_Service_Oauth2::USERINFO_EMAIL);
$client->addScope(\Google_Service_Oauth2::USERINFO_PROFILE);
$client->addScope("https://www.googleapis.com/auth/plus.business.manage");

// Request 1
$client->setAccessToken($token1);
$gmb = new \Google_Service_MyBusiness($client);
$media = $gmb->accounts_locations_media->listAccountsLocationsMedia($name1);
var_dump($media);

// Request 2 -- Fails because it still uses $token1
$client->setAccessToken($token2);
$gmb = new \Google_Service_MyBusiness($client);
$media = $gmb->accounts_locations_media->listAccountsLocationsMedia($name2);
var_dump($media);

1 Ответ

1 голос
/ 23 июня 2019

Похоже, что это ошибка / не существует в google php api клиенте.

Я сообщил о проблеме на github и надеюсь получить ясность там.

https://github.com/googleapis/google-api-php-client/issues/1672

EDIT:

Я получил ответ с решением моей проблемы в Github. Вам необходимо вручную очистить кеш после установки нового маркера доступа.

Привет @ Fredyy90,

Клиент будет кэшировать токены доступа для звонков на тот же сервис с одни и те же области применения. Чтобы сменить токены, вы можете очистить этот кеш:

$client->setAccessToken($token1); // <call 1>

$client->getCache()->clear();

$client->setAccessToken($token2); // <call 2> 

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

...