Intereting Posts
magento set store id программно отладка веб-приложения Yii с использованием Zend Debugger в Eclipse PHP Альтернатива использованию запроса в цикле Typeahead remote с Laravel 4 – Я работаю над отдельными работами, но не работаю вместе Изображение, созданное с помощью blob, содержит только числа и запятые Значение операции для нескольких массивов, имеющих один и тот же ключ Настройка пользовательских параметров при добавлении продукта в корзину через SOAP в Magento Как обойти Laravel Обработка исключений как добавить пользовательский javascript в wordpress functions.php Преодолеть проблемы кодирования с PHP, SoapServer, UTF-8 и неанглийскими символами? Как изменить конфигурацию почты перед отправкой почты в контроллере с помощью Laravel? Запуск PHP: невозможно инициализировать модуль Получите информацию о пользователе в facebook после входа в систему, используя facebook php sdk приемлемо ли перерабатывать или повторно использовать переменные? Удалить трейлинг-косую строку из PHP

Автоматически обновлять токен с помощью google drive api с помощью php-скрипта

Я снова повторил этот учебник, чтобы загрузить файл на Google Диске с помощью php непосредственно из моего REMOTE SERVER: поэтому я создал новый 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); ?> - <?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); ?> - <?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); ?> - <?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); ?> - <?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); ?> - <?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); ?> 

Итак, теперь файл drive.txt загружается на моем Google Диске, а структура файла token.json – это своего рода:

 {"access_token":"XXX","token_type":"Bearer","expires_in":3600,"refresh_token":"YYY","created":1365505148} 

Теперь, как вы можете себе представить, я могу вызвать script2.php и загрузить файл до определенного времени. Наконец, дело в том, что я не хочу, чтобы токен истекал, я не хочу разрешать авторизацию каждый раз, когда он истекает (напомните script1.php): мне нужно периодически вызывать script2.php в течение дня, загружать мой файл автоматически, без взаимодействия с пользователем . Итак, каков наилучший способ автоматического обновления токена навсегда в этом контексте? Нужен ли мне другой скрипт? Можно ли добавить код в script2.php? или изменить файл token.json? И где я могу прочитать время, оставшееся до истечения срока действия токена? Благодаря!

Вам не нужно периодически запрашивать токен доступа. Если у вас есть 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"]; - $_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() , вам необходимо постоянно его хранить. Чтобы получить новый refresh_token, вам нужно отменить существующий токен и снова запустить процесс auth.

Оффлайн-доступ подробно описан в документации Google OAuth 2.0 .

После долгих разговоров я получил это, чтобы работать. Я использую один файл / скрипт, чтобы получить токен офлайн, а затем класс, чтобы делать вещи с помощью 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> с 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