谷歌Analytics(分析)API的OAuth例外“invalid_grant”以服务帐户。

2019-06-27 02:00发布

我通过一个服务帐户查询分析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;

我也试着在这里提出了一个解决方案( https://groups.google.com/forum/?fromgroups#!topic/gs-discussion/3y_2XVE2q7U%5B1-25%5D使用authenticatedRequest(),而不是Google_AnalyticsService):

$req = new Google_HttpRequest($apiUrl);
$resp = $client::getIo()->authenticatedRequest($req);
$result = json_decode($resp->getResponseBody(), true);

这种替代也适用开发服务器上,而不是在生产一个。

我就这一个完全无能。 有没有人见过这种/固定呢?

谢谢!

Answer 1:

显然,问题是该系统暂时关闭。 通过NTP同步通过-ING曾与:

sudo ntpdate npt.ubuntu.com

sudo ntpdate pool.ntp.org

编辑

作为@RafaSashi以下建议,该pool.ntp.org服务器更加可靠。 使用该代替ntp.ubuntu.com (这是工作一个第一我尝试,从而最初的选择)。



Answer 2:

无效的补助还可以,如果你使用了错误的“ServiceAccountId”造成的。 这应该与在谷歌的API访问页面的服务帐户客户端ID,客户端ID相关联的电子邮件。 你还不得不添加该用户到谷歌Analytics帐户,您打算访问。

这绊倒了我,因为我认为他们指的是我的谷歌帐户的电子邮件地址的电子邮件地址,因为我使用了相同的谷歌帐户获得的API访问权限,因为我对谷歌分析做。 我知道室女的已经想通了出来,只是觉得应该在情况下别人遇到了同样的问题添加这个和我一样,他们的电脑似乎是在与NTP同步。



Answer 3:

除了Valer的回答:

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

sudo apt-get install ntp

对于红帽或CentOS的,你需要使用这一个:

yum install ntp

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

sudo ntpdate pool.ntp.org

资源

  • http://www.howtogeek.com/tips/how-to-sync-your-linux-server-time-with-network-time-servers-ntp/

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-time-synchronization-on-ubuntu-12-04



Answer 4:

有主要有两个原因invalid_grant错误,你要照顾刷新令牌和访问令牌的POST请求之前。

  1. 请求头必须包含“内容类型:application / X WWW的窗体-urlencoded”
  2. 您的请求负载进行网址编码表单数据,不发为JSON对象。

RFC 6749的OAuth 2.0定义invalid_grant为: 所提供的授权许可(例如,授权码,资源所有者证书)或刷新令牌无效,已过期,撤销,不匹配URI在授权请求中使用,或已颁发给另一个客户端重定向。

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

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

谷歌游乐场是最好的工具,帮助您如何发送请求。 https://developers.google.com/oauthplayground



文章来源: Google Analytics API oauth exception “invalid_grant” with Service Account. Same code on two servers. Only one works