Tôi đã tìm kiếm gần như mọi kết quả của trang đầu tiên của google cho điều này. Nhưng dường như không thể tìm ra câu trả lời. Tôi đang làm việc với API refresh_token của API Google và nhận:Mã thông báo làm mới của Google-api-php trả về invalid_grant
Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }
Tôi đang làm gì. Thứ nhất: Tôi đang tạo ra và lưu trữ kết nối persistant để 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");
}
tất cả mọi thứ chạy Vì vậy, về cơ bản và token được lưu trữ trong một textfile:
{
"access_token":"xxxxxxxxxxxxxxxN4U0ys2wy5monxs0Xh5fu5ayKL0OIENo-d1sN6g3YA",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"xxxxxxxxxxxxDON-l90BNUcJgnkfZWDfg",
"created":1358120143
}
Khi tôi đang cố gắng để auth sử dụng đoạn mã sau:
$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();
tôi nhận được lỗi sau: lỗi khi làm mới token OAuth2, thông điệp: '{ "lỗi": "invalid_grant"}
grantType không phải là một chức năng trên Google_Client, có chức năng refreshToken, nhưng nó không hoạt động. – Mikushi
Tại sao điều này được chọn là chính xác nếu grantType không phải là một hàm thực sự bên trong lớp Google_Client? – EHerman
Đối với bất kỳ ai khác muốn làm mới mã thông báo truy cập của họ bằng cách sử dụng mã thông báo làm mới, bạn có thể thực hiện '' '$ client-> refreshToken ($ refresh_token); $ _SESSION ['token'] = $ client-> getAccessToken(); '' 'Bạn sẽ nhận được invalid_grant trả về nếu bạn đang cố gắng làm mới một cái gì đó khác với mã thông báo làm mới được cấp gần đây nhất của bạn. – EHerman