Я почти искал каждый результат первой страницы Google для этого. Но не может найти ответа. Я работаю с refresh_token API Google и получаю:
Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }
Что я делаю. Во-первых: я создаю и сохраняю постоянное соединение с google api:
$client = new Google_Client(); $client->setClientId('xxxxxx-s73q0pa41aq3i2kcpatmpas6e6kkp99h.apps.googleusercontent.com'); $client->setClientSecret('xxxxxxxxxxxx'); $client->setRedirectUri('http://xxxxxxxx/generaterefreshtoken.php'); $client->setScopes(array('https://www.googleapis.com/auth/drive')); $client->setAccessType('offline'); if (isset($_GET['code'])) { $client->authenticate(); $_SESSION['token'] = $client->getAccessToken(); $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } if (isset($_REQUEST['logout'])) { unset($_SESSION['token']); $client->revokeToken(); } if ($client->getAccessToken()) { $jsonarray = json_decode($client->getAccessToken()); $arrGoogleAuth['access_token']=$jsonarray->access_token; $arrGoogleAuth['refresh_token']=$jsonarray->refresh_token; //filewrite $myFile = "refreshtoken.conf"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $client->getAccessToken()); fclose($fh); /* die(); $service = new Google_DriveService($client); $file = new Google_DriveFile(); $file->setTitle('My document.txt'); $file->setDescription('A test document'); $file->setMimeType('text/plain'); $data = file_get_contents('document.txt'); $createdFile = $service->files->insert($file, array( 'data' => $data, 'mimeType' => 'text/plain', )); print_r($createdFile); */ // The access token may have been updated lazily. $_SESSION['token'] = $client->getAccessToken(); } else { $auth = $client->createAuthUrl(); header("Location: $auth"); }
с$client = new Google_Client(); $client->setClientId('xxxxxx-s73q0pa41aq3i2kcpatmpas6e6kkp99h.apps.googleusercontent.com'); $client->setClientSecret('xxxxxxxxxxxx'); $client->setRedirectUri('http://xxxxxxxx/generaterefreshtoken.php'); $client->setScopes(array('https://www.googleapis.com/auth/drive')); $client->setAccessType('offline'); if (isset($_GET['code'])) { $client->authenticate(); $_SESSION['token'] = $client->getAccessToken(); $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } if (isset($_REQUEST['logout'])) { unset($_SESSION['token']); $client->revokeToken(); } if ($client->getAccessToken()) { $jsonarray = json_decode($client->getAccessToken()); $arrGoogleAuth['access_token']=$jsonarray->access_token; $arrGoogleAuth['refresh_token']=$jsonarray->refresh_token; //filewrite $myFile = "refreshtoken.conf"; $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $client->getAccessToken()); fclose($fh); /* die(); $service = new Google_DriveService($client); $file = new Google_DriveFile(); $file->setTitle('My document.txt'); $file->setDescription('A test document'); $file->setMimeType('text/plain'); $data = file_get_contents('document.txt'); $createdFile = $service->files->insert($file, array( 'data' => $data, 'mimeType' => 'text/plain', )); print_r($createdFile); */ // The access token may have been updated lazily. $_SESSION['token'] = $client->getAccessToken(); } else { $auth = $client->createAuthUrl(); header("Location: $auth"); }
Так что все работает, и токен хранится в текстовом файле:
{ "access_token":"xxxxxxxxxxxxxxxN4U0ys2wy5monxs0Xh5fu5ayKL0OIENo-d1sN6g3YA", "token_type":"Bearer", "expires_in":3600, "refresh_token":"xxxxxxxxxxxxDON-l90BNUcJgnkfZWDfg", "created":1358120143 }
Когда я пытаюсь использовать следующий код:
$client = new Google_Client(); $client->setClientId($googleDriveConfig['clientid']); $client->setClientSecret($googleDriveConfig['clientsecret']); $client->setRedirectUri(curPageURL); $client->setScopes(array('https://www.googleapis.com/auth/drive')); $client->refreshToken(file_get_contents('../_config/refreshtoken.conf')); $client->authenticate();
Я получаю следующую ошибку: Ошибка обновления токена OAuth2, сообщение: '{"error": "invalid_grant"}
Перед аутентификацией должно быть что-то вроде:
$client->grantType("refresh_token")
Вы получите ошибку «invalid_grant», если попытаетесь обновиться, когда токен не истек.
Вместо этого:
$client->refreshToken(file_get_contents('../_config/refreshtoken.conf'));
Использовать это:
$client->setAccessToken(file_get_contents('../_config/refreshtoken.conf'));
Как только ваш токен истечет, обновление должно работать.
Недопустимый параметр означает, что код авторизации уже используется (доступен в $GET['code']
) или тип приложения, настроенного в консоли API Google, недействителен.
Убедитесь, что вы выбрали «Веб-приложение» при регистрации своего приложения в консоли API Google.
Функция, которая работала для меня, следующая
$ Client-> setAccessType ( "refresh_token");
Я столкнулся с чем-то подобным, и проблема для меня заключалась в том, что мои системные часы (внутри Docker VM, где я запускал код) не синхронизировались с реальным временем. Таким образом, вы запрашиваете токен с датой создания слишком далеко в прошлом или будущем, которую OAuth отвергает.
Здесь я был опрошен.