Analytics API返回:错误请求 - invalid_grant

时间:2015-01-26 10:22:06

标签: php curl google-analytics

我正在使用Google AnalyticsAPI v3。我现在解释我的申请流程

我在这里使用了这个文档:https://developers.google.com/accounts/docs/OAuth2WebServer

首先,为用户生成OAUTH-URL。 URL看起来像这样

https://accounts.google.com/o/oauth2/auth?
client_id={CLIENT-ID}&
redirect_uri={REDIRECT-URL}&
state={CUSTOM-NUMBER}&
response_type=code&
access_type=offline&
approval_prompt=force&
scope=https://www.googleapis.com/auth/analytics

当用户点击他进行身份验证的链接时。然后,通过代码,我获得了访问和刷新令牌。

我使用参数

https://www.googleapis.com/oauth2/v3/token发送请求
code = Code from Analytics
grant_type = authorization_code
client_secret = CLIENT_SECRET
client_id = CLIENT_ID
redirect_uri = REDIRECT_URI

我发送的cURL选项如下:

CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded')

当然,post数据是使用http_build_query构建的,所以我可以使用那个内容类型的标题。

然后,我将获取该用户的所有个人资料,并使用此网址

https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties/~all/profiles

这很有效,我列出了所有个人资料。然后,用户选择其中一个配置文件,我的库将获取用户的当前数据(网页浏览量,访问次数等)

我现在遇到的问题是,当我想每天用cron刷新数据时,我收到错误消息:

'error' => 'invalid_grant',
'error_description' => 'Bad Request'

但我不知道,为什么?

我保存了数据库中配置文件的访问令牌和刷新令牌。然后,在我发出访问数据请求之前重新访问数据时,我会检查令牌是否有效。但即使这样也失败了。

我在这里做这个请求

https://accounts.google.com/o/oauth2/tokeninfo?access_token=ya29.BwHqH8NOPVhafk3SnwbqjLZMXub4Q8bemC-8vKVwp-UjRqaIHRXrzEV3WjInhGzl1-phIn7XI4NnDA

它告诉我,访问令牌无效(这是神秘的,因为我刚认证​​了,5秒后令牌不再有效?

无论如何,我尝试用这个请求刷新它

URL: https://www.googleapis.com/oauth2/v3/token
Parameters: 

client_secret = CLIENT_SECRET
client_id = CLIENT_ID
refresh_token = REFRESH_TOKEN From my database
grant_type = refresh_token

cURL Options: CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded')

然后,使用http_build_query

构建的params的post请求

响应看起来像这样

string(67) "{ "error": "invalid_grant", "error_description": "Bad Request" } "

但我不明白为什么。我使用了前5分钟获得的访问令牌和刷新令牌以及为第一个请求工作的令牌。为什么5分钟后使用相同的令牌不能正常工作?为什么我甚至不能刷新令牌?

2 个答案:

答案 0 :(得分:4)

无效的授权通常有两个可能的原因。

  1. 您的服务器时钟与NTP不同步。 (解决方案:检查服务器时间是否正确修复它。)
  2. 已超出刷新令牌限制。 (解决方案:你无能为力,他们无法使用更多刷新令牌) 应用程序可以请求多个刷新令牌。例如,这在用户想要在多台计算机上安装应用程序的情况下非常有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌变为无效。如果应用程序尝试使用无效的刷新令牌,则会返回invalid_grant错误响应。每个唯一的OAuth 2.0客户端对的限制是25个刷新令牌(请注意,此限制可能会发生变化)。如果应用程序继续请求同一客户端/帐户对的刷新令牌,则一旦发出第26个令牌,先前发出的第一个刷新令牌将变为无效。第27个请求的刷新令牌将使先前发出的第二个令牌失效,依此类推。
  3. 您应该只存储刷新令牌。 Access令牌将在一小时后过期。以下是不同电话Google 3 legged Oauth2 flow的散步。

    我无法从你的代码中弄清楚它看起来有点令人困惑。但是我看不出任何真正错误的东西,这就是为什么我猜它可能是前两个问题之一。

答案 1 :(得分:1)

我知道这个问题已经过时,但由于代码有时会出现斜杠(/)并且在从重定向网址中提取时没有正确解码,因此我遇到了这个问题。

4/BGrvsJeuc5BoRRN ...这样的令牌就像4%2FBGrvsJeuc5BoRRN ...一样在我的服务器上运行。

发布此信息以防其他人像我一样愚蠢。