Автоматическое обновление токена с помощью Google drive api с PHP скриптом

я снова последовал за ним ЭТОТ УЧЕБНИК чтобы загрузить файл на Google Drive с php, непосредственно с моего удаленного сервера: поэтому я создал новый проект API из консоли Google API, включил службу API диска, запросил идентификатор клиента OAuth и секрет клиента, написал их в скрипте, а затем загрузить его вместе с клиентская библиотека Google APIs для PHP

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(), вам нужно постоянно хранить его. Чтобы получить новый refresh_token, вам нужно отозвать существующий токен и снова запустить процесс аутентификации.

автономный доступ подробно объясняется на документация 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>

вы можете загрузить токен обновления из файла и использовать его по мере необходимости для автономного доступа:

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