我通过服务帐户查询Analytics API。
我已经在开发服务器上编写了代码,但它没有问题。 在生产服务器上运行相同的代码时,它会抛出:
Google_AuthException:刷新OAuth2令牌时出错,消息:'{ “错误”:“invalid_grant”}'
我尝试过创建另一个服务帐户,但行为是一样的。
oAuth IETF草案(http://tools.ietf.org/html/draft-ietf-oauth-v2-31)说明了这个错误:
invalid_grant
The provided authorization grant (e.g. authorization
code, resource owner credentials) or refresh token is
invalid, expired, revoked, does not match the redirection
URI used in the authorization request, or was issued to
another client.
这是我写的代码:
$GA_CLIENT_ID = 'XX.apps.googleusercontent.com';
$GA_APP_EMAIL = 'XX@developer.gserviceaccount.com';
$GA_APP_NAME = 'XX';
$GA_KEY_FILE = 'XX';
// create client object and set app name
$client = new Google_Client();
$client->setApplicationName($GA_APP_NAME); // name of your app
// set assertion credentials
$client->setAssertionCredentials(
new Google_AssertionCredentials(
$GA_APP_EMAIL, // email you added to GA
array('https://www.googleapis.com/auth/analytics.readonly'),
file_get_contents($GA_KEY_FILE) // keyfile you downloaded
));
// other settings
$client->setClientId($GA_CLIENT_ID); // from API console
$client->setAccessType('offline_access'); // this may be unnecessary?
// create service and get data
$service = new Google_AnalyticsService($client);
$result = $service->data_ga->get($ids, $startDate, $endDate, $metrics, $optParams);
return $result;
我还尝试使用authenticatedRequest()代替Google_AnalyticsService在此处建议的解决方案(https://groups.google.com/forum/?fromgroups#!topic/gs-discussion/3y_2XVE2q7U%5B1-25%5D):
$req = new Google_HttpRequest($apiUrl);
$resp = $client::getIo()->authenticatedRequest($req);
$result = json_decode($resp->getResponseBody(), true);
此替代方案也适用于开发服务器,但不适用于生产服务器。
我对这一点完全无能为力。有谁见过这个/修好了吗?
谢谢!
答案 0 :(得分:24)
显然问题是系统时间关闭。通过NTP同步:
<击> sudo ntpdate npt.ubuntu.com
击>
sudo ntpdate pool.ntp.org
正如@RafaSashi在下面建议的那样,pool.ntp.org
服务器更可靠。使用它而不是ntp.ubuntu.com
(这是我尝试的第一个工作,因此是最初的选择)。
答案 1 :(得分:2)
如果使用错误的“ServiceAccountId”,也可能导致无效授权。它应该是与google apis访问权限页面中的服务帐户客户端ID中的客户端ID相关联的电子邮件。您还必须将此用户添加到您计划访问的Google Analytics分析帐户。
这让我大吃一惊,因为我认为他们所指的电子邮件地址是我的谷歌帐户的电子邮件地址,因为我使用相同的谷歌帐户来获取api访问权限,就像我为谷歌分析所做的那样。我知道Vir已经把他弄出来了,只是想我会加上这个以防其他人遇到同样的问题而且像我一样,他们的计算机似乎与NTP同步。
答案 2 :(得分:1)
除了Valer的回答:
首先,如果尚未安装NTP,则需要安装NTP。对于Debian或Ubuntu,这将是这个命令:
sudo apt-get install ntp
对于Redhat或CentOS,您需要使用以下内容:
yum install ntp
如果通过npt.ubuntu.com
同步无效,请尝试:
sudo ntpdate pool.ntp.org
<强>资源强>
答案 3 :(得分:1)
invalid_grant 错误有两个主要原因,您必须在刷新令牌和访问令牌的POST请求之前注意。
RFC 6749 OAuth 2.0将 invalid_grant 定义为: 提供的授权授权(例如,授权代码,资源所有者凭据)或刷新令牌无效,已过期,已撤销,与授权请求中使用的重定向URI不匹配,或已发布给其他客户端。
我找到了另一篇好文章,here你会发现很多其他原因导致这个错误。
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
Google Playground是帮助您发送请求的最佳工具。 https://developers.google.com/oauthplayground