Ток доступа OAuth 2.0 истек, а токен обновления недоступен

У меня есть веб-приложение, которое использует Google OAuth2.0 в качестве платформы входа. Он работает до вчерашнего дня. При истечении токена доступа аппликация не смогла получить токен обновления. Кроме того, страница "Запрос на разрешение" изменилась на "Использовать автономный доступ" вместо "Знать, кто вы в Google" и "Просмотреть электронную почту"

Первоначально страница "Запрос на разрешение" запрашивает доступ к "Знать, кто вы в Google" и "Просмотреть электронную почту". После выхода из системы и повторного входа в систему страница "Запросить разрешение" будет одинаковой.

Однако до вчерашнего дня страница "Запрос на разрешение" изменилась на "Доступ к автономному доступу". После того, как токен доступа истек, я получил сообщение об ошибке:

PHP Неустранимая ошибка: исключить исключение "Google_AuthException" с сообщением "Ток доступа к OAuth 2.0 истек, а токен обновления недоступен. Обновленные токены не возвращаются для ответов, которые были автоматически одобрены. ' в /home 2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

Я попробовал $client->setAccessType('online');. Тем не менее, я до сих пор получил эту фатальную ошибку со мной. Ниже мой код, чтобы получить токен доступа:

    if ($client->getAccessToken()) {
      $token = $client->getAccessToken();
      $authObj = json_decode($token);
      $refreshToken = $authObj->refresh_token;
      $user = $oauth2->userinfo->get();
      $me = $plus->people->get('me');
      $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2

      $optParams = array('maxResults' => 100);
      $activities = $plus->activities->listActivities('me', 'public', $optParams);


      $_SESSION['access_token'] = $client->getAccessToken();
    } else {
      $authUrl = $client->createAuthUrl();
    }

Я попытался найти подобную проблему, как я, но я не смог ее найти. Это произошло со вчерашнего дня. До этого я никогда не делал никаких изменений в кодах.

Ответ 1

С его комментариями, Fabian Parzefall помог мне понять это.

Здесь мой script:

if($client->isAccessTokenExpired()) {

    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));

}

Это на самом деле довольно просто. Вместо того, чтобы просить его нажать кнопку "соединить меня" (как показано демо-версией script, предоставленной командой API GA), я перенаправляю его напрямую. Не уверен, что это правильный/безопасный способ, но тот, кто работает для меня прямо сейчас!

Ответ 2

  if($client->isAccessTokenExpired()) {

     $client->authenticate();
     $NewAccessToken = json_decode($client->getAccessToken());
     $client->refreshToken($NewAccessToken->refresh_token);

    }

Ответ 3

Ответ выше - "правильный", но я думал о том, куда его поместить (!)... поэтому отправьте это, чтобы кто-нибудь еще попробовал примеры, которые заканчиваются с токенами, истекающими (!).

Как только ваш код выполнит все необходимые токены, и ваш клиент имеет токен доступа... затем проверьте, что он все еще действителен и если он не отправляется на повторную авторизацию!

// Stuff to do with getting tokens and storing in session etc...

if ($client->getAccessToken()) { // Hey! we got one!
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another
        $authUrl = $client->createAuthUrl();
        header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
        exit();
    }
  try{
...
     }