php – Analytics API返回:错误请求 – invalid_grant

我正在使用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构建的,因此我可以使用该内容类型的标头.

然后,我将使用此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构建的params的post请求

响应看起来像这样

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

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

解决方法:

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

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

您应该只存储刷新令牌. Access令牌将在一小时后过期.这是一个不同的电话Google 3 legged Oauth2 flow步行.

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...