我一直在使用Google AnalyticsAPI(V3)并遇到了som错误 . 首先,一切都设置正确,并与我的测试帐户一起使用 . 但是,当我想从其他 Profiles ID(相同的Google Accont / GA帐户)中获取数据时,我收到403错误 . 奇怪的是,来自某些GA帐户的数据将返回数据,而其他帐户会生成此错误 .
我已经撤销了令牌并再次进行了身份验证,现在看来我可以从我的所有帐户中获取数据 . 问题解决了?不 . 由于访问密钥将过期,我将再次遇到同样的问题 .
如果我理解正确,可以使用resfreshToken来获取新的authenticationTooken .
问题是,当我跑:
$client->refreshToken(refresh_token_key)
返回以下错误:
Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }'
我检查了refreshToken方法背后的代码,并将请求追溯回“apiOAuth2.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
这是一个错误,还是我完全误解了什么?
15 回答
所以我终于想出了如何做到这一点 . 基本的想法是,您有第一次请求身份验证时获得的令牌 . 该第一个令牌具有刷新令牌 . 第一个原始令牌在一小时后到期 . 一小时后,您必须使用第一个令牌中的刷新令牌来获取新的可用令牌 . 您使用
$client->refreshToken($refreshToken)
来检索新令牌 . 我将调用此"temp token."您还需要存储此临时令牌,因为一小时后它也会过期并注意它没有与之关联的刷新令牌 . 为了获得新的临时令牌,您需要使用之前使用的方法并使用第一个令牌的refreshtoken . 我在下面附上了代码,这是丑陋的,但我是新的...问题出在刷新令牌中:
当
'/'
的字符串获得json encoded
时,它会被'\'
转义,因此您需要将其删除 .您的案例中的刷新令牌应为:
我_2710555已完成的是你已经打印了谷歌发回的json字符串并将其复制并粘贴到你的代码中,因为如果你
json_decode
那么它会正确地为你删除'\'
!访问类型应设置为
offline
.state
是您为自己使用而设置的变量,而不是API的用途 .确保你有latest version of the client library并添加:
有关参数的说明,请参见Forming the URL .
这是设置令牌的片段,在此之前确保访问类型应设置为 offline
刷新令牌
这将刷新你的令牌,你必须在会话中更新它,你可以做
@ uri-weg发布的答案对我有用,但由于我没有发现他的解释非常清楚,让我稍微改写一下 .
在第一个访问权限序列期间,在回调中,当您到达收到身份验证代码的位置时,您也必须 save the access token and the refresh token .
原因是google api仅在提示访问权限时才向您发送带有刷新令牌的访问令牌 . 下一个访问令牌将在没有任何刷新令牌的情况下发送(除非您使用
approval_prompt=force
选项) .The refresh token you received the first time stays valid until the user revokes access permission.
在简单的php中,回调序列的一个例子是:
稍后,在简单的php中,连接序列将是:
这是我在我的项目中使用的代码,它工作正常:
有同样的问题;我的剧本昨天有效,因为一些奇怪的原因今天没有 . 没有变化 .
显然这是因为我的系统时钟关闭了2.5(!!)秒,与NTP同步修复了它 .
另见:https://code.google.com/p/google-api-php-client/wiki/OAuth2#Solving_invalid_grant_errors
仅供参考:如果您在过期时拥有刷新令牌,3.0 Google AnalyticsAPI将自动刷新访问令牌,因此您的脚本永远不需要
refreshToken
.(参见
auth/apiOAuth2.php
中的Sign
函数)有时刷新令牌我不是通过使用
$client->setAccessType ("offline");
生成的 .试试这个:
我使用智能代码的示例和当前版本的Google API,但那个没有用 . 我认为他的API太过时了 .
所以,我刚刚根据其中一个API示例编写了我自己的版本...它输出访问令牌,请求令牌,令牌类型,ID令牌,到期时间和创建时间为字符串
如果您的客户端凭据和开发人员密钥是正确的,则此代码应该是开箱即用的 .
我有一个相同的问题与谷歌/谷歌api-php-client v2.0.0-RC7和搜索1小时后,我解决这个问题使用 json_encode 像这样:
这在这里非常好,也许它可以帮助任何人:
的index.php
oauth2callback.php
client.php
action.php的
根据Authentication on google: OAuth2 keeps returning 'invalid_grant'
“您应该重用第一次成功验证后获得的访问令牌 . 如果您之前的令牌尚未过期,您将收到invalid_grant错误 . 请将其缓存到某处,以便您可以重复使用它 . ”
希望能帮助到你
自此问题最初发布以来,Google已做出一些更改 .
这是我目前正在运作的例子 .
使用以下代码段获取刷新令牌