Unable to connect to OAuth 2.0 using PHP

I have a website where I would like to show all visitors some of the data from my Google Analytics account (unique pageviews from different countries). To my knowledge, this can be done using OAuth 2.0 and the Google Analytics API. I would like authentication to be automated so that anyone who comes to my site can view this data, not just me who can log into my Google Analytics account.

What I've done

  • Created a project using the Google Developers Console.
  • Changed the Analytics API to ON.
  • Created a service account.
  • The generated API key for applications on the server and in the browser (I don’t know where and where to use it).
  • The client library of APIs for PHP has been loaded.
  • I downloaded the .p12 key, which was downloaded when I created the service account, uploaded it to my website and linked it to google-api-php-client-master / examples / service-account.php.
  • Declared the client identifier of the service account in google-api-php-client-master / examples / service-account.php.

Current code

<?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__);

Questions

  • In google-api-php-client-master / examples / service-account.php there is this piece of code that I do not quite understand:

    $service_account_name = '';

What should I announce here?

  • When I did all of the above and uploaded the google-api-php-client-master / examples / service-account.php page on my site, I get the following two errors:

Note: you need to set the client ID, email address and key location from the Google API console.

: "Google_Auth_Exception" " OAuth2, :" { "error": "invalid_grant" } '' /home/texterx 1/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- > refreshTokenRequest (Array) # 1/home/texterx1/public_html/google-api-php-client-master/examples/service-account.php(75): Google_Auth_OAuth2- > refreshTokenWithAssertion (Object (Google_Auth_AssertionCredentials)) # 2 {main} /home/texterx 1/public_html/google-api-php-client-master/src/Google/Auth/OAuth2.php 327

?

+4
1

, , , , .

1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com

GA, admin , . , .


<?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";    
    }
                }
            }
        }
+1

Source: https://habr.com/ru/post/1540546/


All Articles