Получение нового токена с помощью токена обновления Google OAuth возвращает недопустимую ошибку предоставления

#oauth #refresh-token #google-classroom

#oauth #обновить токен #google-classroom

Вопрос:

Я запрашиваю доступ к данным Google Classroom пользователя со следующим блоком кода PHP:

 public function getGoogleClassroomToken(){
  
  if($this->user==null){
    return ["result"=>"error","message"=>"You need to log in to do that!"];
  }

  if ($this->user['gc_token']) {
    return ["result"=>"error","message"=>"User already has access token!"];
  }

  $client = new Google_Client();
  $client->setApplicationName('example.com');
  $client->setAuthConfig('/var/www/client_secret.json');
  $client->setAccessType('offline');
  $client->setPrompt('select_account consent');
  $client->addScope(Google_Service_Classroom::CLASSROOM_COURSEWORK_STUDENTS);
  $client->addScope(Google_Service_Classroom::CLASSROOM_COURSES_READONLY);
  $client->addScope(Google_Service_Classroom::CLASSROOM_ROSTERS_READONLY);

  $redirect_uri = 'https://example.com/gc.php';
  $client->setRedirectUri($redirect_uri);
  $authUrl = $client->createAuthUrl();
  return ["result"=>"success","authUrl"=>$authUrl];

}
  

.. который, кажется, работает нормально. Затем я создаю экземпляр клиента Google со следующим блоком кода:

 public function getGoogleClassroomClient(){
  if($this->user==null){return false;}
  if (!$this->user['gc_token']) {return false;}
  $client = new Google_Client();
  $client->setAuthConfig('/var/www/client_secret.json');
  $client->setAccessToken((array)json_decode($this->user['gc_token']));
  
  if ($client->isAccessTokenExpired()) {
    if ($client->getRefreshToken()) {
        $token = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        var_dump($token);
    }
  }
  
  return $client;
}
  

.. который работает нормально, ЕСЛИ ТОКЕН НЕ ИСТЕК, и в этом случае переменная $token выводит:

 array(2) { ["error"]=> string(13) "invalid_grant" ["error_description"]=> string(11) "Bad Request" }
  

Кто-нибудь знает, что здесь может быть не так?

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

1. убедитесь, что токен обновления не равен нулю. затем убедитесь, что дата и время на компьютере, на котором вы запускаете это, синхронизированы с NTP

2. Можете ли вы подтвердить, что токен обновления не равен нулю, как упоминал @DaImTo?

3. Я могу подтвердить, что токен обновления не равен нулю

Ответ №1:

Ответ

Согласно клиентской библиотеке Google APIs для PHP, ваш токен обновления не может быть нулевым без выдвижения этого исключения токен обновления должен быть передан или установлен как часть setAccessToken, что имеет смысл, потому что вы вызываете, $client->getRefreshToken() и это возвращает 2 варианта: токен обновления или null.

Если вы посмотрите на платформу идентификации Google: использование OAuth 2.0 для доступа к API Google > Срок действия токена обновления, кажется, что срок действия вашего токена обновления истек, есть несколько возможных сценариев:

  • Пользователь отозвал доступ к вашему приложению.
  • Токен обновления не использовался в течение шести месяцев.
  • Пользователь сменил пароли, и токен обновления содержит области Gmail.
  • Учетная запись пользователя превысила максимальное количество предоставленных (текущих) токенов обновления.
  • Клиент достиг предела в 50 токенов обновления для каждой учетной записи, если это не учетная запись службы.

Ссылка

Клиент API Google для PHP

Платформа идентификации Google: использование OAuth 2.0 для доступа к API Google