Analytics
5.3K members online now
5.3K members online now
Dive into multiple domain (Cross/Sub) tracking, implementing Ecommerce and Enhanced Ecommerce, setting up Event tracking, and Universal Analytics code.
 
Guide Me
star_border
Reply

Trouble with oauth 2.0 and redirect uri

Visitor ✭ ✭ ✭
# 1
Visitor ✭ ✭ ✭

Hi, let me preface this by saying I am building a web application where the user logins and can see various stats from Google Analytics and some other APIs. Currently I am pulling the data by using a service account that is linked with a google analytics account(via adding the service email as a user to the google analytics account) The problem with this implementation is that the data is hardwired, meaning only data from the account tied to the service email is read, not anyone who logs in will show their data. I am trying to change this by switching from a service account verification to using oauth2callback as shown here https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/web-php#enable.

Following the guide I get a uri mismatch though idk why because the uri matches the one in the devlopers console. The code and credentials are set up as follows 

index.php
        <?php
    // Load the Google API PHP Client Library.
    require_once realpath(dirname(__FILE__).'/google-api-php-client/src/Google/autoload.php');

    // Start a session to persist credentials.
    //session_start();

    // Create the client object and set the authorization configuration
    // from the client_secretes.json you downloaded from the developer console.
    $client = new Google_Client();
    $client->setAuthConfigFile('client_secrets.json');
    $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);

    // If the user has already authorized this app then get an access token
    // else redirect to ask the user to authorize access to Google Analytics.
    if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
      // Set the access token on the client.
      $client->setAccessToken($_SESSION['access_token']);

      // Create an authorized analytics service object.
      $analytics = new Google_Service_Analytics($client);

      // Get the first view (profile) id for the authorized user.
      $profile = getFirstProfileId($analytics);

      // Get the results from the Core Reporting API and print the results.
      $results = getResults($analytics, $profile);
      printResults($results);
    } else {
      $redirect_uri = 'http://example.info/oauth2callback.php';
      header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    }


    function getFirstprofileId(&$analytics) {
      // Get the user's first view (profile) ID.

      // Get the list of accounts for the authorized user.
      $accounts = $analytics->management_accounts->listManagementAccounts();

      if (count($accounts->getItems()) > 0) {
        $items = $accounts->getItems();
        $firstAccountId = $items[0]->getId();

        // Get the list of properties for the authorized user.
        $properties = $analytics->management_webproperties
            ->listManagementWebproperties($firstAccountId);

        if (count($properties->getItems()) > 0) {
          $items = $properties->getItems();
          $firstPropertyId = $items[0]->getId();

          // Get the list of views (profiles) for the authorized user.
          $profiles = $analytics->management_profiles
              ->listManagementProfiles($firstAccountId, $firstPropertyId);

          if (count($profiles->getItems()) > 0) {
            $items = $profiles->getItems();

            // Return the first view (profile) ID.
            return $items[0]->getId();

          } else {
            throw new Exception('No views (profiles) found for this user.');
          }
        } else {
          throw new Exception('No properties found for this user.');
        }
      } else {
        throw new Exception('No accounts found for this user.');
      }
    }

    function getResults(&$analytics, $profileId) {
      // Calls the Core Reporting API and queries for the number of sessions
      // for the last seven days.
      return $analytics->data_ga->get(
          'ga:' . $profileId,
          '7daysAgo',
          'today',
          'ga:sessions');
    }

    function printResults(&$results) {
      // Parses the response from the Core Reporting API and prints
      // the profile name and total sessions.
      if (count($results->getRows()) > 0) {

        // Get the profile name.
        $profileName = $results->getProfileInfo()->getProfileName();

        // Get the entry for the first entry in the first row.
        $rows = $results->getRows();
        $sessions = $rows[0][0];

        // Print the results.
        print "<p>First view (profile) found: $profileName</p>";
        print "<p>Total sessions: $sessions</p>";
      } else {
        print "<p>No results found.</p>";
      }
    }
oauth2callback.php
    <?php
    require_once realpath(dirname(__FILE__).'/google-api-php-client/src/Google/autoload.php');



    $client = new Google_Client();
    $client->setAuthConfigFile('client_secrets.json');
    $client->setRedirectUri('http://example.info/index.php');
    $client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);

    if (! isset($_GET['code'])) {
      $auth_url = $client->createAuthUrl();
      header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
    } else {
      $client->authenticate($_GET['code']);
      $_SESSION['access_token'] = $client->getAccessToken();
      $redirect_uri = 'http://example.info/index.php';
      header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    }

oauth2callback.png

When I run example.info/index.php I get the error  

400. That’s an error.

 

Error: redirect_uri_mismatch

 

The redirect URI in the request, http://example.info/info.php, does not match the ones authorized for the OAuth client.