服务应用程序和 Google Analytics API V3:服务器到服务器 OAuth2 身份验证?

我正在尝试制作一个服务器应用程序,以定期从我自己的GA帐户中提取Google Analytics(分析)数据。请注意,它是一个访问我自己的数据的个人服务器端应用程序,即没有最终用户访问此应用程序。

因此,我在Google API控制台中将我的应用程序注册为服务应用程序,它为我提供了客户端ID私钥。我的理解是,服务应用程序不使用应用程序机密重定向 URL,因为在此服务器到服务器身份验证流中没有最终用户。事实上,Google API Console没有给我任何秘密,也没有提示我输入重定向URL。

不幸的是,我无法弄清楚如何在Google的PHP客户端API中验证我的服务应用程序。有大量关于最终用户验证 Web 应用程序的文档。

Google的文档表明,可以通过使用私钥对JWT请求进行签名来对服务器进行身份验证。我只是不知道如何在PHP客户端API中执行此操作(尽管我已经浏览了源代码,并且肯定有一个脚本可以使用私钥签署请求。

我在这里错过了什么吗?如何使用我的私钥和 Google PHP 客户端 API 为服务应用程序执行身份验证?

为清晰起见,已编辑


答案 1

更新 2012年7月21日

Google Analytics(分析)API V3 现在支持由 .p12 签名的 JWT 请求返回的 OAuth2 令牌。也就是说,我们现在可以使用带有服务帐户的分析 API

目前拉动4年的日复一日的指标,只是为了它。

这是一个快速的“n”脏分步:

  1. 转到 Google API 控制台并创建一个新应用

  2. 在“服务”标签中,翻转“Google Analytics(分析)”开关

  3. “API 访问”选项卡中,单击“创建 OAuth2.0 客户端 ID”

    • 输入您的姓名,上传徽标,然后点击下一步

    • 选择“服务帐户”选项,然后按“创建客户端 ID”

    • 下载您的私钥

  4. 现在,你已返回到“API 访问”页。您将看到一个名为“服务帐户”的部分,其中包含客户 ID电子邮件地址

    • 复制电子邮件地址(类似于 ##@developer.gserviceaccount.com)

    • 访问您的 GA 管理员并将此电子邮件作为用户添加到您的媒体资源中

    • 这是必须的。否则,你会得到神秘的错误。

  5. 通过 Github 获取最新的 Google PHP Client API

    git submodule add https://github.com/google/google-api-php-client.git google-api-php-client-read-only
    
  6. 摇滚乐(感谢大家关于更新班级名称的提示):

    // api dependencies
    require_once(PATH_TO_API . 'Google/Client.php');
    require_once(PATH_TO_API . 'Google/Service/Analytics.php');
    
    // create client object and set app name
    $client = new Google_Client();
    $client->setApplicationName(APP_NAME); // name of your app
    
    // set assertion credentials
    $client->setAssertionCredentials(
      new Google_Auth_AssertionCredentials(
    
        APP_EMAIL, // email you added to GA
    
        array('https://www.googleapis.com/auth/analytics.readonly'),
    
        file_get_contents(PATH_TO_PRIVATE_KEY_FILE)  // keyfile you downloaded
    
    ));
    
    // other settings
    $client->setClientId(CLIENT_ID);           // from API console
    $client->setAccessType('offline_access');  // this may be unnecessary?
    
    // create service and get data
    $service = new Google_Service_Analytics($client);
    $service->data_ga->get($ids, $startDate, $endDate, $metrics, $optParams);
    

 

下面的原始解决方法


似乎,尽管文档含糊不清,但大多数Google API还不支持服务帐户,包括Google Analytics。它们无法消化由 .p12 签名的 JWT 请求返回的 OAuth2 令牌。因此,截至目前,您无法将Google Analytics API V3与服务帐户一起使用

解决方法:

  1. Google API 控制台中,创建一个客户端应用。

  2. 按照 Google PHP Client API 示例中的步骤,使用您的 、 和client_auth_urlclient_idclient_secretredirect_uri

  3. 使用 cURL 登录谷歌。(请务必使用 Cookie 文件!

  4. 在 cURL 中打开 并填写表单。确保将 和 设置为 响应的标头中。client_auth_urlcurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);curl_setopt($ch, CURLOPT_HEADER, 1);authorization_codeLocation:

  5. 使用步骤 4 中的 、 、 和激活码,向 Google 的 OAuth2 令牌计算机发布请求。确保在帖子字段中包含。client_idclient_secretredirect_urigrant_type = "authorization_code"

  6. 呵呵,你现在有一个永不过期的,还有一个工作!将请求与 、 、 和 一起发布到 Google 的 OAuth2 令牌计算机,并在到期时收到一个新的请求。refresh_tokenaccess_tokenclient_idclient_secretredirect_urirefresh_tokenaccess_token


答案 2

Google API PHP Client 现在支持主干上的服务帐户。

该实现尚未发布,因此您需要签出最新版本的PHP客户端。

我准备了一个示例应用程序,演示如何使用服务帐户来访问 Google 预测 API。要查看示例,请查看示例/预测/服务帐户.php或访问:http://code.google.com/p/google-api-php-client/source/browse/trunk/examples/prediction/serviceAccount.php


推荐