Автоматическое обновление токена с помощью google drive api с php скриптом
Я пошел снова Этот учебник, чтобы загрузить файл на Google Диск с помощью PHP, прямо с моего удаленного сервера: так что я создал новый API проекта с Google API в консоли, включается привод API сервиса, запрашиваемый идентификатор клиента OAuth и секрет клиента, писал их в сценарий, а затем загрузить его вместе с API-интерфейсы Google клиентской библиотеки для PHP папку для этого http://www.MYSERVER.com/script1.php, чтобы получить код авторизации:
<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';
$drive = new Google_Client();
$drive->setClientId('XXX'); // HERE I WRITE MY Client ID
$drive->setClientSecret('XXX'); // HERE I WRITE MY Client Secret
$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
$drive->setScopes(array('https://www.googleapis.com/auth/drive'));
$gdrive = new Google_DriveService($drive);
$url = $drive->createAuthUrl();
$authorizationCode = trim(fgets(STDIN));
$token = $drive->authenticate($authorizationCode);
?>
Когда я посещаю http://www.MYSERVER.com/script1.php я разрешаю авторизацию и получаю код Auth, который я могу написать во втором скрипте. Затем я загружаю его в http://www.MYSERVER.com/script2.php , который выглядит так:
<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';
$drive = new Google_Client();
$drive->setClientId('X'); // HERE I WRITE MY Client ID
$drive->setClientSecret('X'); // HERE I WRITE MY Client Secret
$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
$drive->setScopes(array('https://www.googleapis.com/auth/drive'));
$gdrive = new Google_DriveService($drive);
$_GET['code']= 'X/XXX'; // HERE I WRITE AUTH CODE RETRIEVED AFTER RUNNING REMOTE script.php
file_put_contents('token.json', $drive->authenticate());
$drive->setAccessToken(file_get_contents('token.json'));
$doc = new Google_DriveFile();
$doc->setTitle('Test Drive');
$doc->setDescription('Document');
$doc->setMimeType('text/plain');
$content = file_get_contents('drive.txt');
$output = $gdrive->files->insert($doc, array(
'data' => $content,
'mimeType' => 'text/plain',
));
print_r($output);
?>
Ну, теперь файловый диск.txt загружается на мой Google Диск и структура токена.файл json-это своего рода:
{"access_token":"XXX","token_type":"Bearer","expires_in":3600,"refresh_token":"YYY","created":1365505148}
Теперь, как вы можете себе представить, я могу назвать script2.php и загрузить файл до определенного времени. Наконец, суть в следующем: я не хотите, чтобы токен истекал, я не хочу разрешать авторизацию каждый раз, когда он истекает (вспоминая script1.php): мне нужно вызвать script2.php периодически в течение дня, чтобы загрузить мой файл автоматически, без взаимодействия с пользователем . Итак, каков лучший способ автоматически обновить маркер навсегда в этом контексте? Нужен ли мне еще один сценарий? Могу ли я добавить некоторый код в script2.php? или измените маркер.файл json? И где я могу прочесть время, оставшееся до начала срок действия токена истек? Спасибо!
2 ответов:
Вам не нужно периодически запрашивать маркер доступа. Если у вас есть refresh_token, PHP клиент автоматически получит новый маркер доступа для вас.
Чтобы получить refresh_token, вам нужно установить access_type в "offline" и запросить разрешения на автономный доступ:
$drive->setAccessType('offline');Как только вы получите
code,$_GET['code']= 'X/XXX'; $drive->authenticate(); // persist refresh token encrypted $refreshToken = $drive->getAccessToken()["refreshToken"];Для будущих запросов убедитесь, что обновленный токен всегда установлен:
$tokens = $drive->getAccessToken(); $tokens["refreshToken"] = $refreshToken; $drive->setAccessToken(tokens);Если вы хотите обновить маркер принудительного доступа, вы можете сделать это с помощью вызов
refreshToken:$drive->refreshToken($refreshToken);Будьте осторожны,
refresh_tokenбудет возвращен только на первом$drive->authenticate(), вам нужно постоянно хранить его. Для того, чтобы получить новый маркер обновления, вы должны отменить ваш существующий маркер и снова начать процесс авторизации.Автономный доступ подробно описан в документации OAuth 2.0 от Google.
После того, как я много возился, у меня это получилось. Я использую один файл / скрипт, чтобы получить автономный токен, а затем класс, чтобы делать вещи с api:
require_once 'src/Google/autoload.php'; // load library session_start(); $client = new Google_Client(); // Get your credentials from the console $client->setApplicationName("Get Token"); $client->setClientId('...'); $client->setClientSecret('...'); $client->setRedirectUri('...'); // self redirect $client->setScopes(array('https://www.googleapis.com/auth/drive.file')); $client->setAccessType("offline"); $client->setApprovalPrompt('force'); if (isset($_GET['code'])) { $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); $client->getAccessToken(["refreshToken"]); $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); return; } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } if (isset($_REQUEST['logout'])) { unset($_SESSION['token']); $client->revokeToken(); } ?> <!doctype html> <html> <head><meta charset="utf-8"></head> <body> <header><h1>Get Token</h1></header> <?php if ($client->getAccessToken()) { $_SESSION['token'] = $client->getAccessToken(); $token = json_decode($_SESSION['token']); echo "Access Token = " . $token->access_token . '<br/>'; echo "Refresh Token = " . $token->refresh_token . '<br/>'; echo "Token type = " . $token->token_type . '<br/>'; echo "Expires in = " . $token->expires_in . '<br/>'; echo "Created = " . $token->created . '<br/>'; echo "<a class='logout' href='?logout'>Logout</a>"; file_put_contents("token.txt",$token->refresh_token); // saving access token to file for future use } else { $authUrl = $client->createAuthUrl(); print "<a class='login' href='$authUrl'>Connect Me!</a>"; } ?> </body> </html>Вы можете загрузить маркер обновления из файла и использовать его по мере необходимости для автономного доступа:
class gdrive{ function __construct(){ require_once 'src/Google/autoload.php'; $this->client = new Google_Client(); } function initialize(){ echo "initializing class\n"; $client = $this->client; // credentials from google console $client->setClientId('...'); $client->setClientSecret('...'); $client->setRedirectUri('...'); $refreshToken = file_get_contents(__DIR__ . "/token.txt"); // load previously saved token $client->refreshToken($refreshToken); $tokens = $client->getAccessToken(); $client->setAccessToken($tokens); $this->doSomething(); // go do something with the api } }Подробнее здесь: https://github.com/yannisg/Google-Drive-Uploader-PHP
Comments