如何使用GoogleAPI客户端刷新令牌?

如何使用GoogleAPI客户端刷新令牌?

我一直在玩GoogleAnalyticsAPI(V3),并且遇到了一些错误。首先,所有的设置都是正确的,并与我的测试帐户一起工作。但是当我想从另一个配置文件ID(相同的Googleaccont/GA帐户)获取数据时,我会得到一个403错误。奇怪的是,来自某些GA帐户的数据将返回数据,而其他帐户将生成此错误。


我已经撤销了令牌并再次进行了身份验证,现在我似乎可以从我的所有帐户中获取数据。问题解决了?不。由于访问密钥将过期,我将再次遇到相同的问题。


如果我对事情的理解是正确的,人们可以使用新的Token获得一个新的身份验证Tooken。


问题是,当我跑:


$client->refreshToken(refresh_token_key) 

返回以下错误:


Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }'

我检查了刷新方法背后的代码,并将请求跟踪到“apoAuth2.php”文件中。所有参数都正确发送。Grant_type在方法中被硬编码为“REFRESH_TOKEN”,所以我很难理解出了什么问题。参数数组如下所示:


Array ( [client_id] => *******-uqgau8uo1l96bd09eurdub26c9ftr2io.apps.googleusercontent.com [client_secret] => ******** [refresh_token] => 1\/lov250YQTMCC9LRQbE6yMv-FiX_Offo79UXimV8kvwY [grant_type] => refresh_token )

程序如下。


$client = new apiClient();

$client->setClientId($config['oauth2_client_id']);

$client->setClientSecret($config['oauth2_client_secret']);

$client->setRedirectUri($config['oauth2_redirect_uri']);

$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');

$client->setState('offline');


$client->setAccessToken($config['token']); // The access JSON object.


$client->refreshToken($config['refreshToken']); // Will return error here

这是一个错误,还是我完全误解了什么?


忽然笑
浏览 1069回答 3
3回答

九州编程

所以我终于想出了怎么做。基本思想是,您拥有第一次请求身份验证时得到的令牌。第一个令牌具有刷新令牌。第一个原始令牌在一个小时后过期。一个小时后,您必须使用来自第一个令牌的刷新令牌来获得一个新的可用令牌。你用$client->refreshToken($refreshToken)检索新令牌。我称之为“临时令牌”。您还需要存储这个临时令牌,因为一个小时后它也过期了,并注意到它没有与它相关的刷新令牌。为了获得一个新的临时令牌,您需要使用之前使用的方法,并使用第一个令牌的刷新令牌。我在下面附加了一些代码,很难看,但我在这方面是新的.//pull&nbsp;token&nbsp;from&nbsp;database$tokenquery="SELECT&nbsp;*&nbsp;FROM&nbsp;token&nbsp;WHERE&nbsp;type='original'";$tokenresult&nbsp;=&nbsp;mysqli_query($cxn,$tokenquery);if($tokenresult!=0){ &nbsp;&nbsp;&nbsp;&nbsp;$tokenrow=mysqli_fetch_array($tokenresult); &nbsp;&nbsp;&nbsp;&nbsp;extract($tokenrow);}$time_created&nbsp;=&nbsp;json_decode($token)->created;$t=time();$timediff=$t-$time_created;echo&nbsp;$timediff."<br>";$refreshToken=&nbsp;json_decode($token)->refresh_token;//start&nbsp;google&nbsp;client&nbsp;note:$client&nbsp;=&nbsp;new&nbsp;Google_Client();$client->setApplicationName('');$client->setScopes(array());$client->setClientId('');$client->setClientSecret('');$client->setRedirectUri('');$client->setAccessType('offline');$client->setDeveloperKey('');//resets&nbsp;token&nbsp;if&nbsp;expiredif(($timediff>3600)&&($token!='')){ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$refreshToken."</br>"; &nbsp;&nbsp;&nbsp;&nbsp;$refreshquery="SELECT&nbsp;*&nbsp;FROM&nbsp;token&nbsp;WHERE&nbsp;type='refresh'"; &nbsp;&nbsp;&nbsp;&nbsp;$refreshresult&nbsp;=&nbsp;mysqli_query($cxn,$refreshquery); &nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;a&nbsp;refresh&nbsp;token&nbsp;is&nbsp;in&nbsp;there... &nbsp;&nbsp;&nbsp;&nbsp;if($refreshresult!=0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$refreshrow=mysqli_fetch_array($refreshresult); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extract($refreshrow); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$refresh_created&nbsp;=&nbsp;json_decode($token)->created; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$refreshtimediff=$t-$refresh_created; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Refresh&nbsp;Time&nbsp;Diff:&nbsp;".$refreshtimediff."</br>"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;refresh&nbsp;token&nbsp;is&nbsp;expired &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($refreshtimediff>3600) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$client->refreshToken($refreshToken); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$newtoken=$client->getAccessToken(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$newtoken."</br>"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tokenupdate="UPDATE&nbsp;token&nbsp;SET&nbsp;token='$newtoken'&nbsp;WHERE&nbsp;type='refresh'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysqli_query($cxn,$tokenupdate); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$token=$newtoken; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"refreshed&nbsp;again"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;the&nbsp;refresh&nbsp;token&nbsp;hasn't&nbsp;expired,&nbsp;set&nbsp;token&nbsp;as&nbsp;the&nbsp;refresh&nbsp;token &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$client->setAccessToken($token); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"use&nbsp;refreshed&nbsp;token&nbsp;but&nbsp;not&nbsp;time&nbsp;yet"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;a&nbsp;refresh&nbsp;token&nbsp;isn't&nbsp;in&nbsp;there... &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$client->refreshToken($refreshToken); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$newtoken=$client->getAccessToken(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$newtoken."</br>"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tokenupdate="INSERT&nbsp;INTO&nbsp;token&nbsp;(type,token)&nbsp;VALUES&nbsp;('refresh','$newtoken')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysqli_query($cxn,$tokenupdate); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$token=$newtoken; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"refreshed&nbsp;for&nbsp;first&nbsp;time"; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//if&nbsp;token&nbsp;is&nbsp;still&nbsp;good.if(($timediff<3600)&&($token!='')){ &nbsp;&nbsp;&nbsp;&nbsp;$client->setAccessToken($token);}$service&nbsp;=&nbsp;new&nbsp;Google_DfareportingService($client);

缥缈止盈

下面是要设置令牌的代码段,请确保访问类型设置为离线if&nbsp;(isset($_GET['code']))&nbsp;{ &nbsp;&nbsp;$client->authenticate(); &nbsp;&nbsp;$_SESSION['access_token']&nbsp;=&nbsp;$client->getAccessToken();}刷新令牌$google_token=&nbsp;json_decode($_SESSION['access_token']);$client->refreshToken($google_token->refresh_token);这将刷新您的令牌,您必须在会话中更新它,您可以这样做。&nbsp;$_SESSION['access_token']=&nbsp;$client->getAccessToken()
打开App,查看更多内容
随时随地看视频慕课网APP