How to use refresh token to get authorized in back

2020-02-02 03:25发布

问题:

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.

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

回答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);
        }
        ?>