提问者:小点点

无法使用PHP连接到OAuth 2.0


我有一个网站,我想向所有访问者展示我的谷歌分析账户中的一些数据(来自不同国家的独特页面视图)。就我而言,使用OAuth 2.0和Google Analytics API可以做到这一点。我想认证是自动化的,这样无论谁来到我的网站可以查看这些数据,而不仅仅是我谁可以登录到我的谷歌分析帐户。

  • 与谷歌开发者控制台做了一个项目。
  • 将Analytics(分析)API更改为ON。
  • 创建了一个服务号
  • 为服务器和浏览器应用程序生成的API密钥(不知道确切使用哪个和在哪里)。
  • 下载了用于PHP的Google API客户端库。
  • 上传了当我创建服务号时下载的. p12密钥,将其上传到我的网站,并在google-api-php-client-master/service-account.php.中链接到它
  • 在google-api-php-client-master中声明我的服务号客户端ID/service-account.php.
<?php
/*
 * Copyright 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
session_start();
include_once "templates/base.php";

/************************************************
  Make an API request authenticated with a service
  account.
 ************************************************/
set_include_path("../src/" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Service/Books.php';

/************************************************
  ATTENTION: Fill in these values! You can get
  them by creating a new Service Account in the
  API console. Be sure to store the key file
  somewhere you can get to it - though in real
  operations you'd want to make sure it wasn't
  accessible from the webserver!
  The name is the email address value provided
  as part of the service account (not your
  address!)
  Make sure the Books API is enabled on this
  account as well, or the call will fail.
 ************************************************/
$client_id = 'SECRET-NUMBERS.apps.googleusercontent.com';
$service_account_name = '';
$key_file_location = 'SOMENUMBERS-privatekey.p12';

echo pageHeader("Service Account Access");
if ($client_id == 'SECRET-NUMBERS.apps.googleusercontent.com'
    || !strlen($service_account_name)
    || !strlen($key_file_location)) {
  echo missingServiceAccountDetailsWarning();
}

$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$service = new Google_Service_Books($client);

/************************************************
  If we have an access token, we can carry on.
  Otherwise, we'll get one with the help of an
  assertion credential. In other examples the list
  of scopes was managed by the Client, but here
  we have to list them manually. We also supply
  the service account
 ************************************************/
if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/analytics.readonly'),
    $key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();

/************************************************
  We're just going to make the same call as in the
  simple query as an example.
 ************************************************/
$optParams = array('filter' => 'free-ebooks');
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams);
echo "<h3>Results Of Call:</h3>";
foreach ($results as $item) {
  echo $item['volumeInfo']['title'], "<br /> \n";
}

echo pageFooter(__FILE__);

>

  • 在google api php客户端主/示例/服务帐户中。php有一段我不太理解的代码:

    $service\u account\u name=''

    我应该在这里申报什么?

    • 当我完成以上所有操作并加载页面GoogleAPI php客户端主/示例/服务帐户时。在我的网站上,我发现以下两个错误:

    警告:您需要从Google API控制台设置客户端ID,电子邮件地址和Key的位置

    致命错误:未捕获异常'Google_Auth_Exception',消息'错误刷新OAuth2令牌,消息:'{"错误":"invalid_grant"}"在 /home/texterx1/public_html/google-api-php-client-master/src/Google/Auth/OAuth2.php:327堆栈跟踪:#0 /home/texterx1/public_html/google-api-php-client-master/src/Google/Auth/OAuth2.php(289):Google_Auth_OAuth2-

    我做错了什么?


  • 共1个答案

    匿名用户

    好的,您需要做的第一件事是在开发者控制台上获取与应用一起创建的应用的电子邮件地址。

    1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com
    

    登录到您的GA转到要服务帐户访问的帐户的管理部分。您需要给该电子邮件帐户访问在帐户级别只是给他们阅读和分析。

    <?php
    session_start();
    require_once 'Google/Client.php';
    require_once 'Google/Service/Analytics.php';
    // Values from APIs console for your app    
    $client_id = 'Client ID';
    $service_account_name = 'Email address';
    $key_file_location = 'The file you downloaded';
    
    $client = new Google_Client();
    $client->setApplicationName("Client_Library_Examples");
    if (isset($_SESSION['service_token'])) {
            $client->setAccessToken($_SESSION['service_token']);
        }
        $key = file_get_contents($key_file_location);
    
        $cred = new Google_Auth_AssertionCredentials(
            $service_account_name,
            array('https://www.googleapis.com/auth/analytics.readonly'),
            $key
            );
        $client->setAssertionCredentials($cred);
        if($client->getAuth()->isAccessTokenExpired()) {
            $client->getAuth()->refreshTokenWithAssertion($cred);
        }
        $_SESSION['service_token'] = $client->getAccessToken();
        $service = new Google_Service_Analytics($client);  
        $accounts = $service->management_accountSummaries->listManagementAccountSummaries();
    
       foreach ($accounts->getItems() as $item) {
        echo "Account: ",$item['name'], "  " , $item['id'], "<br /> \n";
    
        foreach($item->getWebProperties() as $wp) {
        echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebProperty: ' ,$wp['name'], "  " , $wp['id'], "<br /> \n";    
    
        $views = $wp->getProfiles();
        if (!is_null($views)) {
        foreach($wp->getProfiles() as $view) {
            //  echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View: ' ,$view['name'], "  " , $view['id'], "<br /> \n";    
        }
                    }
                }
            }