2015-11-23 1 views
1

Я пытаюсь получить accessToken с помощью refreshToken, ниже, я разместил свой код, пожалуйста, кто-нибудь мне.Как использовать токен обновления, чтобы получить разрешение в фоновом режиме и получить токен доступа?

Это из плагина wordpress, который я разрабатываю, мне нужно только восстановить pageViews и pagePath, поэтому не предпочитая использовать доступный плагин.

Взятые справка из 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); 
    } 
    } 

Потратив много времени Я получил ошибку: answerecode 400 для $request = $this->client->getIo()->makeRequest($http);, и это недопустимый грант.

full code

+0

Вы получаете сообщение об ошибке? – DaImTo

+0

@DaImTo нет, я не получаю никаких ошибок или результатов. –

+0

@DaImTo добавил полный код gistgithub ссылку на мой вопрос. –

ответ

2

Вот как я решил эту проблему, мы должны хранить refreshToken в нашей базе данных, и с помощью этого refreshToken, мы можем получить еще один маркер доступа .which может быть использован, чтобы получить результат, и это не нужна другая аутентификация.

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

 Смежные вопросы

  • Нет связанных вопросов^_^