Обновить токены Google OAuth 2.0 PHP

0

Используя код 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();
  }
?>
Теги:
oauth-2.0
google-oauth

2 ответа

0

Старый вопрос, но я надеюсь, что это все равно поможет кому-то. Это шаги, которые я выполнил для обновления токена на стороне сервера (нет необходимости в входе пользователя в систему).

  1. В приложении Google Developer Console создайте новый идентификатор клиента для OAuth, используя " https://developers.google.com/oauthplayground " в качестве перенаправления uri. (вам нужно это для аутентификации на игровой площадке)
  2. На странице https://developers.google.com/oauthplayground/ нажмите значок настроек в верхнем правом углу и установите флажок "Использовать собственные учетные данные OAuth". Вам необходимо вставить действительные учетные данные (идентификатор клиента и секрет клиента), сгенерированный в точке 1.
  3. Выберите и авторизуйте свой Api в левом столбце ("Шаг 1")
  4. Как только вы получите авторизационный код, замените его на токены ("Шаг 2")
  5. Теперь вы можете использовать идентификатор клиента, секрет клиента (тот же, что вы использовали в точке 2), и токен обновления (тот, который вы получили в точке 4) в вашем скрипте.

Это рабочий код, который я использую (например, для 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');
  • 0
    Откуда этот токен обновления? Я думал, что токены обновления генерируются при входе пользователей в систему, поэтому это будет уникальный токен. Поправь меня, если я ошибаюсь.
  • 0
    Вы правы, в моем примере вам не нужно, чтобы пользователь входил в систему. Я только что обновил свой ответ.
Показать ещё 3 комментария
0

Храните токен обновления в сеансе, как показано на рисунке:

$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();
  • 0
    Где истекает команда? Также имеет значение, где я помещаю это в мой код?
  • 0
    добавил примечание на isAccessTokenExpired
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню