Google PHP SDK 未更改 setAccessToken 上的 Accesstoken
Google PHP SDK not changing Accesstoken on setAccessToken
我正在构建一个小工具来同时管理多个 GMB 位置,但我 运行 遇到了 google php api client 的问题。
我正在从我的数据库中获取多个 users/locations 的访问令牌,并希望循环更新它们,但是 google php api 客户端没有改变在第二次使用 setAccesstoken 的请求中使用的访问令牌。
第一个循环之后的每个 运行 循环将继续使用第一个 运行 中的访问令牌,即使 getAccesstoken()
return 是正确的访问令牌。似乎内部使用的 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);
}
}
}
编辑:
我做了另一个例子来从我自己的代码中删除所有变量。请求 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);
这似乎是 bug/not google php api 客户端中的现有功能。
我在 github 上报告了一个问题,希望在那里得到澄清。
https://github.com/googleapis/google-api-php-client/issues/1672
编辑:
我在 Github 收到了 reply 的问题解决方案。设置新的accesstoken后需要手动清除缓存。
Hi @Fredyy90,
The client will cache access tokens for calls to the same service with
the same scopes. To change tokens, you can clear this cache:
$client->setAccessToken($token1); // <call 1>
$client->getCache()->clear();
$client->setAccessToken($token2); // <call 2>
We'll see about ways we
can make this behavior clearer and provide more control to people
looking to modify the tokens.
我正在构建一个小工具来同时管理多个 GMB 位置,但我 运行 遇到了 google php api client 的问题。
我正在从我的数据库中获取多个 users/locations 的访问令牌,并希望循环更新它们,但是 google php api 客户端没有改变在第二次使用 setAccesstoken 的请求中使用的访问令牌。
第一个循环之后的每个 运行 循环将继续使用第一个 运行 中的访问令牌,即使 getAccesstoken()
return 是正确的访问令牌。似乎内部使用的 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);
}
}
}
编辑:
我做了另一个例子来从我自己的代码中删除所有变量。请求 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);
这似乎是 bug/not google php api 客户端中的现有功能。
我在 github 上报告了一个问题,希望在那里得到澄清。
https://github.com/googleapis/google-api-php-client/issues/1672
编辑:
我在 Github 收到了 reply 的问题解决方案。设置新的accesstoken后需要手动清除缓存。
Hi @Fredyy90,
The client will cache access tokens for calls to the same service with the same scopes. To change tokens, you can clear this cache:
$client->setAccessToken($token1); // <call 1>
$client->getCache()->clear();
$client->setAccessToken($token2); // <call 2>
We'll see about ways we can make this behavior clearer and provide more control to people looking to modify the tokens.