How to use refresh token to get authorized in background and getting access token?

I am trying to get accessToken using refreshToken, below I have posted my code please someone guide me.

It is from a wordpress plugin I am developing, I only need to retrieve pageViews
and pagePath so not preferring using a available plugin.

Read More

Taken reference from Use OAuth Refresh Token to Obtain New Access Token – Google API

 if( isset( $this->options['authenication_code'] ) ){   //plugin setting page settings 
                global $wpdb;
                $resultset = $wpdb->get_row( 'SELECT `refreshToken` FROM ' . $wpdb->prefix . 'analyticaAnalytics WHERE authenication_code ="' . $this->options["authenication_code"] . '"', ARRAY_A );
                var_dump( $resultset['refreshToken'] ); //retrieved refreshToken from database
                if ($client->isAccessTokenExpired()) {              //boolean true
                    $client->refreshToken( $resultset['refreshToken'] ); 
                    var_dump( $client );//getting blank
                }
            }

../google-api-php-client/src/Google/Auth/oauth2.php

private function refreshTokenRequest($params)
  { 
    if (isset($params['assertion'])) {

      $this->client->getLogger()->info(
          'OAuth2 access token refresh with Signed JWT assertion grants.'
      );
    } else {
        $this->client->getLogger()->info('OAuth2 access token refresh');
    }

    $http = new Google_Http_Request(
        self::OAUTH2_TOKEN_URI,
        'POST',
        array(),
        $params
    );

    $http->disableGzip();
    $request = $this->client->getIo()->makeRequest($http);
    //var_dump( $request );exit;//response 400, invalid grant
    $code = $request->getResponseHttpCode();

    $body = $request->getResponseBody();
    if (200 == $code) {
      $token = json_decode($body, true);
      if ($token == null) {
        throw new Google_Auth_Exception("Could not json decode the access token");
      }

      if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
        throw new Google_Auth_Exception("Invalid token format");
      }

      if (isset($token['id_token'])) {
        $this->token['id_token'] = $token['id_token'];
      }
      $this->token['access_token'] = $token['access_token'];
      $this->token['expires_in'] = $token['expires_in'];
      $this->token['created'] = time();
    } else {
      throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
    }
  }

After spending a lot of time I got the error is responsecode 400 for $request = $this->client->getIo()->makeRequest($http); and that is invalid grant.

full code

Related posts

1 comment

  1. This is how , I solved the problem, We need to store the refreshToken in our database and using that refreshToken, We can get another accessToken .which can be used to get the result and it does not need another authentication .

    <?php
            $client = new Google_Client();
            $client->setAuthConfigFile(plugin_dir_url( __FILE__ ) . '/client_secrets.json');
            $client->setRedirectUri( site_url() . '/wp-admin/admin.php?page=analytica-admin-settings');
            $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
            $client->setIncludeGrantedScopes(true);
            $client->setAccessType('offline');
            if ( isset( $_GET['code'] )) {
    
                if($client->isAccessTokenExpired()){
    
                    $client->authenticate($_GET['code']);
    
                    $accessToken = $client->getAccessToken();
                    $refreshToken = $client->getRefreshToken();
    
                    $analytica_tokens = json_encode( array( 'time' => current_time( 'mysql' ),'accessToken' =>  $accessToken, 'refreshToken' => $refreshToken ) );
                    update_option( 'analytica_tokens', $analytica_tokens );
                } 
            } else {
                $resultset = json_decode(get_option('analytica_tokens'));
    
                if ($client->isAccessTokenExpired()) {
                    if( isset( $resultset ) ){
                        $refreshToken = $resultset->refreshToken;
                        $client->refreshToken( $refreshToken );
                        $accessToken = $client->getAccessToken();           
                        $analytica_tokens = json_encode( array( 'time' => current_time( 'mysql' ), 'accessToken' =>  $accessToken, 'refreshToken' => $refreshToken ) );
                        update_option( 'analytica_tokens', $analytica_tokens );
                    } else {
                        echo 'You need to reauthorize the application to get the analytics report.';
                    }
                }
            }
            $auth_url = $client->createAuthUrl();
            ?>
             <a class="connect-to-google-analytics" href='<?php echo $auth_url; ?>'  id="loginText">Connect To Your Google Analytics Account </a>
            <?php
            if( isset($accessToken) ){
                $_SESSION['access_token'] = $accessToken ? $accessToken : $refreshToken;
                $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 = $this->getFirstProfileId($analytics);
    
                // Get the results from the Core Reporting API and print the results.
                $this->results = $this->getResults($analytics, $profile);
            }
            ?>
    

Comments are closed.