2016-05-23 3 views
0

Цельне удается обновить маркер в Google API

Мне нужно получить данные из Google Analytics после того, как мои пользователи вышли из системы. В основном они отправятся на мой сайт, разрешат моему приложению получать доступ к своим данным GA, а в полночь я беру данные и обрабатываю их в своем сервисе.

Мой текущий поток

После прочтения многих любые сообщения и вопросы вот что я придумал:
Передняя торцевая часть выглядит несколько так:

<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script> 
<script> 
    function start() { 
     gapi.load('auth2', function() { 
      auth2 = gapi.auth2.init({ 
       client_id: '{{CLIENT_ID}}.apps.googleusercontent.com', 
       scope: 'https://www.googleapis.com/auth/analytics', 
       access_type: 'offline' 
      }); 
     }); 
    } 
    $('#signinButton').click(function() { 
     auth2.grantOfflineAccess({ 
      'redirect_uri': 'postmessage' 
     }).then(signInCallback); 
    }); 

    function signInCallback(authResult) { 
     window.console.log('signInCallback: This code must be exchanged by the server, it grants access to request a refresh token: ',authResult, arguments); 
     if (authResult['code']) { 
      // Hide the sign-in button now that the user is authorized, for example: 
      $('#signinButton').attr('style', 'display: none').after('<p>The auth code is: ' + authResult['code'] + '</p>'); 

      $.get('http://mysite.dev/oauth_callback.php?code=' + authResult['code']) 
       .fail(function(err){console.error(err)}) 
       .done(function(data) { 
        var message; 
        if (typeof data.error == 'undefined') { 
         message = '<div style="border: green solid 1px;">Finished the request and got ' + data + '</div>'; 
        } else { 
         message = '<div style="border: red solid 1px;">' + data.message + '</div>'; 
        } 
        $('#signinButton').after(message); 
       }); 
     } else { 
      // There was an error. 
     } 
    } 
</script> 

мои oauth_callback.php проверяет ответ от google и сохраняет его в базе данных (пожалуйста, игнорируйте бит $ .get vs $ post).

Из моих тестов я вижу, что auth_code вместе с refresh_token и другими частями правильно хранится в моей базе данных.

Теперь я вручную запустить мой полуночный скрипт, который выглядит немного как это:

public function get_client() { 
    // Create and configure a new client object. 
    $client   = new \Google_Client(); 
    $path_to_config = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my-client-secret.apps.googleusercontent.com.json'; 
    $scopes = array(
     'https://www.googleapis.com/auth/analytics' 
    ); 

    $client->setAuthConfigFile($path_to_config); 
    $client->setApplicationName("My app"); 
    $client->setAccessType('offline'); 
    return $client; 
} 
public function fetch_visits() { 
    foreach ($this->_accounts as $account_id => $auth_json_string) { 

     $client = $this->get_client(); 
     $ga_code_array = json_decode($auth_json_string, true); 

     $ga_code_string = $auth_json_string; 

     $client->setAccessToken($auth_json_string); 
     var_dump($client); 
     if ($client->isAccessTokenExpired()) { 
      $client->setAccessType('offline'); 
      var_dump('Not authed because the access token expired. Requesting another one'); 
      $client->refreshToken($auth_json_string);; 
      $is_authed_now = $client->isAccessTokenExpired(); 
      var_dump($is_authed_now); 
     } 
     die('sadasdsdsa'); 
    } 
} 

Ошибка

С помощью этого кода Im получая позорный: Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant"" ошибку, которую я прослежена в библиотеку OAuth и в основном Google, возвращающий http-код 400 (вместо 200), который говорит мне, что строка $ auth_json_string неверна, но это та же строка, что и Google, после того, как пользователь разрешил мое приложение, поэтому я действительно не знаете, где проблема.

Помните, что это приложение «сервер-сервер», пользователь не будет регистрироваться при запуске моего сервиса, поэтому я сохраняю объект auth json.

Вы видите, что я делаю неправильно?

+0

Взгляните на мой ответ здесь - http://stackoverflow.com/a/35638759/468862 - дайте мне знать, если это помогает. Но вам, вероятно, нужно использовать токен обновления, а не токен доступа, поскольку токен доступа сохраняется только в течение часа - следовательно, ошибка. Кроме того, мне нужно будет найти ссылку на документы, но я уверен, что вы не можете использовать JS-библиотеку для доступа в автономный режим. Опять же, посмотрите на мой ответ, который делает это серверной стороной. –

ответ

0

Для PHP я установил следующие

$ client-> setAccessType ("refresh_token");

И это разрешило мою проблему. Я использую gmail для этого, но должен работать для других сервисов Google. Не забудьте сохранить refresh_token при создании первого запроса access_token, иначе у вас будет больше проблем.

Так что я теперь есть функция под названием getClient()

function getClient(){ 
    $googleUser = $this->getUserDetails(); 
    $client = new Google_Client(); 
    $client->setAuthConfigFile('client_secret.json'); 

    $client->setApplicationName("YOUR_APP_NAME"); 

    $data = $googleUser->attributes; 



    $client->setAccessToken(json_encode($data)); 

    if($client->isAccessTokenExpired()){ 


     $client->addScope(Google_Service_Gmail::MAIL_GOOGLE_COM); 

     $client->setAccessType("refresh_token"); 

     $client->refreshToken($data['refresh_token']); 



     $access_token = $client->getAccessToken(); 


     $data1 = json_decode($access_token); 


     $googleUser->access_token = $data1->access_token; 
     $googleUser->token_type = $data1->token_type; 
     $googleUser->expires_in = $data1->expires_in; 
     $googleUser->created_date = date('Y-m-d h:i:s',$data1->created); 
     $googleUser->created = $data1->created; 

     $googleUser->save(); 


     $client->setAccessToken($access_token); 

    } 

    return $client; 
} 
Смежные вопросы