PHP Google API客户端不一致无法加载正确的凭据

时间:2016-02-26 15:31:21

标签: php session google-api gmail-api google-api-php-client

基本上,我一直在使用PHP Google API客户端库来访问多个用户的gmail收件箱(他们允许通过oAuth2工作流程访问)并提取一些数据......

观察: 客户仅在10到15分钟后才能正确验证身份... 一旦使用令牌验证用户的gmail收件箱,该用户就可以访问数据。但是当下一个令牌用于验证另一个用户的gmail收件箱时,PHP google api客户端不会重新加载,而是使用前一个用户(我怀疑它已被缓存/存储在会话中)。

代码流程

<?php
$tokenArray = array();
foreach($tokenArray as $token) {
 $googleclient = getGoogleClient($token);
 //$googleclient is stale even after the second iteration of the foreach loop
 $service = new Google_Service_Gmail($googleclient);
 $googleuser = "me";
 //if we change the variable $googleuser to some email address "xyz@gmail.com", we get a "Delegation denied for xyz@gmail.com"
 $userprofile = $service->users->getProfile($googleuser);
 var_dump($userprofile);//same data
}
?>

如果我们将它从循环中取出并在25-30分钟后进行单独调用(或重新启动apache webserver),则第二个令牌将在客户端库中正确使用。

是因为Google API PHP客户端库正在缓存该对象并重新使用它30分钟,还是我错过了什么?

我的问题是在处理多个令牌时我应该怎么做才能重新加载客户端?

是否有正确的方式/任何其他方式来初始化客户端?

你们是否有任何PHP Google API客户端库的代码片段...我已在官方文档中检查过它但无济于事...

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

在我删除了“php客户端库”并从git“ git clone -b v1-master https://github.com/google/google-api-php-client.git 下载了一套新软件后,此问题得以修复 “

并链接了已下载集合中的autoload.php文件...(“ google-api-php-client / src / Google / autoload.php ”)

以前我使用Composer来构建它......但是现在我根本没有使用Composer,Google API“PHP Client Library”工作得很好......

我也面临新问题......

问题1)致命错误:在google-api-php-client / src / Google / Auth / OAuth2.php中显示消息'Google_Auth_Exception'并显示消息'无法json解码令牌'

解决方案:而不是传递令牌字符串的关联数组,而不是传递令牌字符串... $ client-&gt; setAccessToken($ tokenstring);然后它就解决了。还要确保json_encode()从$ client-&gt; getAccessToken()返回的字符串;在将其存储在数据库或文件中之前

问题2)未捕获的异常“Google_Auth_Exception”,并显示消息“获取OAuth2访问令牌时出错,消息:'invalid_grant:代码已被兑换。'

解决方案:之前,当我们调用$ client-&gt; authenticate($ code)时,google api似乎将错误消息作为关联数组返回;但现在它抛出一个错误......所以使用try {} catch()进行错误处理解决了问题

问题的根源2)是firefox的预取功能...

firefox尝试两次点击网址进行预取,并提出异常...... 仍在尝试克服问题(2)