分析 API 返回:错误请求 - invalid_grant


Analytics API returns: Bad request - invalid_grant

我正在使用Google Analytics API v3。我现在将解释我的应用程序流程

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

首先,为用户生成一个 OAUTH-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')

当然,帖子数据是用http_build_query构建的,所以我可以使用该内容类型标头。

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

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构建的参数的 post 请求

响应如下所示

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

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

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

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

应仅存储刷新令牌。 访问令牌将在一小时后过期。 这是一次散步,虽然在不同的调用谷歌 3 腿 Oauth2 流。

我无法从您的代码中找出任何东西,看起来有点混乱。 但我看不到任何真正看起来不对劲的东西,这就是为什么我猜测这可能是前两个问题之一。

我知道

这个问题已经过时了,但是由于斜杠(/)代码有时有并且在从重定向URL中提取时没有正确解码而遇到了这个问题。

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

发布此内容以防其他人像我一样愚蠢。