9

我正在通过Service Account查询 Analytics API 。

我已经在开发服务器上编写了代码,它可以正常工作。在生产服务器上运行相同的代码时,它会抛出:

Google_AuthException:刷新 OAuth2 令牌时出错,消息:'{“error”:“invalid_grant”}'

我已经尝试创建另一个服务帐户,并且行为是相同的。

oAuth IETF 草案 ( https://datatracker.ietf.org/doc/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

4 回答 4

24

显然问题是系统时间关闭。通过 NTP 同步工作:

sudo ntpdate npt.ubuntu.com

sudo ntpdate pool.ntp.org

编辑

正如@RafaSashi 下面建议的那样,pool.ntp.org服务器更可靠。使用它代替ntp.ubuntu.com (这是我尝试的第一个工作,因此是最初的选择)

于 2012-08-16T00:30:10.647 回答
2

如果您使用错误的“ServiceAccountId”,也可能导致无效授权。它应该是与 google apis 访问页面中服务帐户客户端 ID 中的客户端 ID 关联的电子邮件。您还必须将此用户添加到您计划访问的谷歌分析帐户。

这让我大吃一惊,因为我认为他们所指的电子邮件地址是我的 google 帐户的电子邮件地址,因为我使用相同的 google 帐户来获取 api 访问权限,就像我为 google 分析所做的那样。我知道 Vir 已经想通了,只是想我会添加这个以防其他人遇到同样的问题,并且像我一样,他们的计算机似乎与 NTP 同步。

于 2013-05-03T17:49:47.187 回答
2

除了 Valer 的回答:

首先,如果尚未安装 NTP,则需要安装它。对于 Debian 或 Ubuntu,这将是这个命令:

sudo apt-get install ntp

对于 Redhat 或 CentOS,你需要使用这个:

yum install ntp

如果通过同步npt.ubuntu.com不起作用,请尝试:

sudo ntpdate pool.ntp.org

资源

于 2015-05-15T12:38:49.447 回答
1

在对 Refresh Token 和 Access Token 发出 POST 请求之前,您必须注意invalid_grant错误的两个主要原因。

  1. 请求头必须包含“content-type: application/x-www-form-urlencoded”
  2. 您的请求负载应该是 url 编码的表单数据,不要作为 json 对象发送。

RFC 6749 OAuth 2.0将invalid_grant定义为: 提供的授权授权(例如,授权代码、资源所有者凭据)或刷新令牌无效、已过期、已撤销、与授权请求中使用的重定向 URI 不匹配,或已发布给另一个客户端.

我找到了另一篇好文章,在这里你会发现这个错误的许多其他原因。

https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35

Google Playground是帮助您发送请求的最佳工具。 https://developers.google.com/oauthplayground

于 2017-09-27T06:47:00.370 回答