Php Analytics API返回:错误请求-无效的授权

Php Analytics API返回:错误请求-无效的授权,php,curl,google-analytics,Php,Curl,Google Analytics,我正在使用谷歌分析API v3。我现在将解释我的申请流程 我在这里使用了以下文档: 首先,为用户生成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& app

我正在使用谷歌分析API v3。我现在将解释我的申请流程

我在这里使用了以下文档:

首先,为用户生成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
string(67) "{ "error": "invalid_grant", "error_description": "Bad Request" } "
当用户单击他验证的链接时。之后,通过代码,我将获得访问和刷新令牌

我正在向
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\u HTTPHEADER=array('Content-Type:application/x-www-form-urlencoded')

当然,post数据是使用http_build_查询构建的,因此我可以使用该内容类型头

然后,我用这个URL获取用户的所有配置文件

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

这很有效,我列出了所有的配置文件。然后,用户选择其中一个配置文件,my library为用户获取当前数据(页面浏览、访问等)

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

'error' => 'invalid_grant',
'error_description' => 'Bad Request'
但我不知道,为什么

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

我在这里做这个请求

它告诉我,访问令牌是无效的(这很神秘,因为我刚刚通过身份验证,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_查询生成的参数生成post请求

反应是这样的

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
string(67) "{ "error": "invalid_grant", "error_description": "Bad Request" } "

但我不知道为什么。我使用的是5分钟前获得的访问令牌和刷新令牌,以及第一个请求使用的令牌。为什么5分钟后使用相同的令牌不起作用?为什么我甚至不能刷新令牌?

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

  • 您的服务器时钟与NTP不同步。(解决方案:如果服务器时间不正确,请检查服务器时间。)
  • 已超过刷新令牌限制。(解决方案:您无能为力-无法使用更多的刷新令牌) 应用程序可以请求多个刷新令牌。例如,这在用户希望在多台计算机上安装应用程序的情况下非常有用。在这种情况下,需要两个刷新令牌,每次安装一个。当刷新令牌的数量超过限制时,旧的令牌将无效。如果应用程序尝试重新安装如果刷新令牌无效,则返回无效的\u grant错误响应。OAuth 2.0客户端的每个唯一对的限制为25个刷新令牌(请注意,此限制可能会更改)。如果应用程序继续为同一客户机/帐户对请求刷新令牌,则一旦发出第26个令牌,先前发出的第一个刷新令牌将无效。第27个请求的刷新令牌将使先前发出的第二个令牌无效,依此类推
  • 您应该只存储刷新令牌。访问令牌将在一小时后过期。下面是对不同调用的演练


    我无法从你的代码中找出任何东西。它看起来有点混乱。但我看不到任何看起来确实错误的东西。这就是为什么我猜测它可能是前两个问题之一。

    我知道这个问题已经过时,但我遇到这个问题是因为斜杠(
    /
    )在从重定向url提取时,代码有时会出现错误,并且没有正确解码

    所以像
    4/BGrvsJeuc5BoRRN…
    这样的令牌像
    4%2FBGrvsJeuc5BoRRN…
    一样出现在我的服务器上


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

    嗨,谢谢你的回答。回复1.当前日期是
    周一1月26日11:31:12 CET 2015
    这听起来很正确。2.问题是,我甚至没有生成新的刷新令牌。我想刷新访问令牌,甚至连访问令牌都不起作用。另外,我是我们正在刷新5分钟前发出的访问令牌。这意味着,它应该仍然有效,不是吗?另外,正如我所说,当访问令牌无效时,我正在尝试使用刷新令牌生成一个新的令牌。但是,我没有刷新刷新令牌。只是刷新访问令牌。我的代码中有什么可以更改的,或者我可以提供进一步的代码吗e来帮助您理解它?当您请求一个新的访问令牌时,您使用刷新令牌,它将为您提供一个新的访问令牌,除非您再次请求用户访问,否则您的刷新令牌将永远不会更改。您好。我想这里可能有一点误解。是的,刷新令牌永远不会更改,我知道。我只是指的是第2点你的回答是,你说谷歌只能发行25个刷新令牌。但是,我甚至没有使用新的刷新令牌。我正在对所有其他请求使用当前的刷新令牌。这也会为我生成一个新的访问令牌。但是,即使这样也失败了,标题中出现了错误。只是一个跟进。看起来你的p是对的第2点。问题是,我认为刷新令牌是根据谷歌分析配置文件的。因此,像UA-XXXXX-01和UA-XXXXX-02一样,可能都有25个刷新令牌。但事实是,刷新令牌对这两个帐户都有作用。我只是有一个误解。谷歌说,刷新令牌是根据谷歌用户Ac计算的计数,我认为它们是每个配置文件。感谢您的回答。我现在接受您的答案并投票表决。:)