Google AnalyticsAPI oauth例外" invalid_grant"与服务帐户。两台服务器上的代码相同。只有一个有效

时间:2012-08-15 16:26:00

标签: php api exception oauth google-analytics-api

我通过服务帐户查询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);

此替代方案也适用于开发服务器,但不适用于生产服务器。

我对这一点完全无能为力。有谁见过这个/修好了吗?

谢谢!

4 个答案:

答案 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请求之前注意。

  1. 请求标头必须包含&#34; content-type:application / x-www-form-urlencoded&#34;
  2. 您的请求有效负载应该是url编码的表单数据,不要作为json对象发送。
  3. 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