Используя код Google OAuth 2.0 с этого сайта https://github.com/google/google-api-php-client
Мне нужна помощь в кодировании токена обновления в следующем коде, я не уверен, как это сделать, есть много ресурсов, но я не могу найти, что помогает мне включить его в мой код. Текущая проблема теперь в том, что если я дам токену истечь, это дает мне ошибку, говоря, что у меня нет токена обновления, и мне это нужно, потому что я не хочу использовать параметр force для accesstype. Я использую php-клиент:
//include google api files
require_once 'src/Google/Client.php';
require_once 'src/Google/Service/Oauth2.php';
//start session
$client_id = 'xxxx';
$client_secret = 'xxxx';
$redirect_uri = 'xxxxx';
$client = new Google_Client();
$client->setApplicationName("Backpack Em");
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));
$client->setAccessType('offline');
$service = new Google_Service_Oauth2 ($client);
if (isset($_REQUEST['logout'])) {
unset($_SESSION['upload_token']);
$client->revokeToken(); //added
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); //redirect user back to page
}
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['upload_token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
if (isset($_SESSION['upload_token']) && $_SESSION['upload_token']) {
$client->setAccessToken($_SESSION['upload_token']);
if ($client->isAccessTokenExpired()) {
unset($_SESSION['upload_token']);
}
}
if ($client->getAccessToken())
{
//For logged in user, get details from google using access token
$user = $service->userinfo->get($params);
//$user_id = filter_var($user['id'],FILTER_SANITIZE_SPECIAL_CHARS);
$user_name = filter_var($user['name'], FILTER_SANITIZE_SPECIAL_CHARS);
$first_name = filter_var($user['given_name'], FILTER_SANITIZE_SPECIAL_CHARS);
$last_name = filter_var($user['family_name'], FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
$profile_url = filter_var($user['link'], FILTER_VALIDATE_URL);
$profile_image_url = filter_var($user['picture'], FILTER_VALIDATE_URL);
$gender = filter_var($user['gender'], FILTER_SANITIZE_SPECIAL_CHARS);
$personMarkup = "$email<div><img src='$profile_image_url?sz=50'></div>";
$_SESSION['upload_token'] = $client->getAccessToken();
$_SESSION['upload_token'] = $client->getRefreshToken();
}
else
{
$authUrl = $client->createAuthUrl();
}
?>
Старый вопрос, но я надеюсь, что это все равно поможет кому-то. Это шаги, которые я выполнил для обновления токена на стороне сервера (нет необходимости в входе пользователя в систему).
Это рабочий код, который я использую (например, для Google Analytics):
$clientId = 'xxxxxxxxxxxxxxxxx'; // from google developer console
$clientSecret = 'xxxxxxxxxxxxxx'; // from google developer console
$refreshToken = 'xxxxxxxxxx'; // from https://developers.google.com/oauthplayground/
$client = new Google_Client();
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->refreshToken($refreshToken);
$access_token = $client->getAccessToken();
$client->setAccessToken($access_token);
$analytics = new Google_Service_Analytics($client);
$response = $analytics->data_ga->get(
'ga:' . xxxxxxx,
'7daysAgo',
'today',
'ga:sessions');
Храните токен обновления в сеансе, как показано на рисунке:
$refresh_token = $client->getRefreshToken();
$_SESSION['refresh_token'] = $refresh_token;
И когда вы хотите получить новый токен доступа, вы можете позвонить:
$refresh_token = $_SESSION['refresh_token'];
$client->refreshToken($refreshToken);
$access_token = $client->getAccessToken();
$_SESSION['upload_token'] = $access_token;
Вы можете вызвать $client>isAccessTokenExpired()
чтобы узнать, истек ли токен доступа, и вам нужно будет активировать поток обновления.
Чтобы напечатать/получить доступ к значению expires_in
, вы можете использовать:
$json = json_decode($client->getAccessToken());
echo $json['expires_in'];
но помните, что expires_in
относится к моменту создания токена, поэтому, чтобы проверить, истек ли токен, вы должны использовать:
$expired = ($json['created'] + $json['expires_in']) < time();
isAccessTokenExpired