Google API всегда запрашивает?

#php #google-api #google-oauth #google-api-php-client

Вопрос:

У меня возникли проблемы с приложениями, которые запрашивают у пользователя доступ к приложению после истечения срока действия токена (1 час). Я искал старые проблемы, но мне ничего не помогло. Если у кого-нибудь есть время просмотреть мой код и найти ошибку, я был бы признателен.

   function getClient()
    {
  $client = new Google_Client();
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  //disable SSL
  $guzzleClient = new GuzzleHttpClient(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
  $client->setHttpClient($guzzleClient);
  $sample_passthrough_value = 'someregularstring22';
  $client->setApplicationName('GDrive_Trello');
  $client->setScopes('https://www.googleapis.com/auth/drive');
  $client->setAuthConfig('credentials.json');
  $client->setState($sample_passthrough_value);
  $client->setRedirectUri($redirect_uri);
  $client->setAccessType('offline');
  $client->setIncludeGrantedScopes(true); 
  
  
  $tokenPath = 'token.json';
  if (file_exists($tokenPath)) {
      $accessToken = json_decode(file_get_contents($tokenPath), true);
      $client->setAccessToken($accessToken);
  }

  if ($client->isAccessTokenExpired()) {
      if ($client->getRefreshToken()) {
          $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
      } else {
          $authUrl = $client->createAuthUrl();
          header("Location: " . $authUrl);
          if(isset($_GET['code'])){
              $authCode = $_GET['code'];    
              header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
            } else{
                $authCode= null;
            }
            
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

          if (array_key_exists('error', $accessToken)) {
              throw new Exception(join(', ', $accessToken));
          }
      }
      if (!file_exists(dirname($tokenPath))) {
          mkdir(dirname($tokenPath), 0700, true);
      }
      file_put_contents($tokenPath, json_encode($client->getAccessToken()));
  } 
  return $client;
}
 

Комментарии:

1. Если вы не храните маркер обновления в каком-то месте, куда он направляется. что находится в файле, хранящемся в токене. json не загружает маркер обновления.

2. Знак. json содержит токен обновления, если вы на это указываете? Если это не так, я не знаю, что мне делать. Можете ли вы привести мне пример? Заранее спасибо!

Ответ №1:

Первое, что вам нужно сделать, это начать считывать токен обновления с токена.файл json. У меня сейчас не установлен php, поэтому я не могу это проверить. Просто убедитесь, что вы загрузили его, а затем используете setRefreshToken , чтобы установить его как часть объекта клиента. Чтобы проверить это, просто распечатайте объект $client, чтобы убедиться, что он установлен.

 $tokenPath = 'token.json';
  if (file_exists($tokenPath)) {
      $accessToken = json_decode(file_get_contents($tokenPath), true);
      $refresToken= // do something hear to load that refresh token;
      $client->setAccessToken($accessToken);
      $client->RefreshToken($refresToken);
  }
 

Затем, когда вы проверяете наличие isAccessTokenExpired библиотеки, она должна автоматически загружать вам новый токен доступа.

 if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
    }
 

Комментарии:

1. Хорошая логика, к сожалению, такого метода setRefreshToken не существует, но я постараюсь придерживаться этой логики. Еще раз спасибо!

2. Удалите набор его просто обновить $клиент->Обновить($_SESSION[‘refresh_token’]) — это то, что я использую, когда это веб-приложение