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