#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 токенов обновления для каждой учетной записи, если это не учетная запись службы.
Ссылка
Платформа идентификации Google: использование OAuth 2.0 для доступа к API Google