Как использовать токен обновления для авторизации в фоновом режиме и получения токена доступа?

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

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

Получено от Используйте маркер обновления OAuth для получения нового токена доступа — 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);
}
}

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

полный код

1

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector