Google PHP Client Library - "Login Required" Exception

When I try to access my Google Analytics data, I get the following error: exception 'Google_Service_Exception' with message 'Error calling GET ...my query...': (401) login required

I'm not sure how to fix this and I've already spent hours trying to install this without success.

Here's my code:

        $client = new \Google_Client();
        $client->setApplicationName("My App");
        $client->setDeveloperKey('my API key');

        $analytics = new \Google_Service_Analytics($client);

        $OBJresult = $analytics->data_ga->get(
            'ga:myprofileid' .,
            '2012-01-01',
            date("Y-m-d"),
            'ga:visits',
            array(
                'filters' => 'ga:pagePath==/home',
                'dimensions' => 'ga:pagePath',
                'metrics' => 'ga:pageviews',
                'sort' => '-ga:pageviews'
            )
        );

      

+3


source to share


4 answers


If you are only accessing your own data, you should go to the service account. If you want to be able to login and see other people's data, then you should use Oauth2.

service account Example:

<?php
   require_once 'Google/autoload.php';
   session_start();     
/************************************************   
 The following 3 values an befound in the setting   
 for the application you created on Google      
 Developers console.         Developers console.
 The Key file should be placed in a location     
 that is not accessable from the web. outside of 
 web root.       web root.

 In order to access your GA account you must    
 Add the Email address as a user at the     
 ACCOUNT Level in the GA admin.         
 ************************************************/
    $client_id = '[Your client id]';
    $Email_address = '[YOur Service account email address Address]';     
    $key_file_location = '[Locatkon of key file]';      

    $client = new Google_Client();      
    $client->setApplicationName("Client_Library_Examples");
    $key = file_get_contents($key_file_location);    

    // seproate additional scopes with a comma   
    $scopes ="https://www.googleapis.com/auth/analytics.readonly";  

    $cred = new Google_Auth_AssertionCredentials($Email_address,         
                             array($scopes),        
                             $key);     

    $client->setAssertionCredentials($cred);
    if($client->getAuth()->isAccessTokenExpired()) {        
         $client->getAuth()->refreshTokenWithAssertion($cred);      
    }       

    $service = new Google_Service_Analytics($client);



    //Adding Dimensions
    $params = array('dimensions' => 'ga:userType'); 
    // requesting the data  
    $data = $service->data_ga->get("ga:89798036", "2014-12-14", "2014-12-14", "ga:users,ga:sessions", $params );     
?>

<html>   
Results for date:  2014-12-14<br>
    <table border="1">   
        <tr>     
        <?php    
        //Printing column headers
        foreach($data->getColumnHeaders() as $header){
             print "<td><b>".$header['name']."</b></td>";       
            }       
        ?>      
        </tr>       
        <?php       
        //printing each row.
        foreach ($data->getRows() as $row) {        
            print "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td></tr>";   
        }    
?>      
<tr><td colspan="2">Rows Returned <?php print $data->getTotalResults();?> </td></tr>     
</table>     
</html>     

      



Useful links:

+2


source


The code shown is not authenticated anywhere.

I am not an expert on this API, but according to this link, you are missing some of the following options.



$client = new Google_Client();
$client->setAccessType('online'); // default: offline
$client->setApplicationName('My Application name');
$client->setClientId('INSERT HERE');
$client->setClientSecret('INSERT HERE');
$client->setRedirectUri($scriptUri);
$client->setDeveloperKey('INSERT HERE'); // API key

      

0


source


The accepted answer didn't work for my service account. What worked instead:

  • Create an IAM service account and admin panel . Make sure the key file is in JSON format.
  • Download this key file to a location accessible from your script (but not accessible from the internet!)
  • Run the following code:

$service_url = "https://www.googleapis.com/auth/analytics.readonly"; $client = new Google_Client(); $client->setAuthConfigFile($key_file_location); // path to your json key file $client->addScope($service_url); // URL to the service you're planning to use // Run your queries here

0


source


DalmTo's answer did the trick , but if you don't want to hardcode it $client_id

and you can simplify it a bit:

public function __construct() {
    $this->client = new Google_Client();
    $credentials = $this->client->loadServiceAccountJson(__DIR__.'/../../google-service-account.json', [Google_Service_Calendar::CALENDAR]);
    $this->client->setAssertionCredentials($credentials);

    if($this->getAuth()->isAccessTokenExpired()) {
        $this->getAuth()->refreshTokenWithAssertion($credentials);
    }
}

/**
 * @return \Google_Auth_OAuth2
 */
public function getAuth() {
    return $this->client->getAuth();
}

      

Where google-service-account.json

is the key file they give you when they create the service account. It looks like this:

{
  "type": "service_account",
  "project_id": "xxxxxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n",
  "client_email": "xxxxxxxxxx@xxxxxxx.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxxx.iam.gserviceaccount.com"
}

      

0


source







All Articles