自动刷新令牌使用谷歌驱动api与php脚本



我再次遵循本教程,直接从我的远程服务器上用php在谷歌驱动器上上传文件:所以我从谷歌API控制台创建了新的API项目,启用驱动器API服务,请求OAuth客户端ID和客户端秘密,将它们写在脚本中,然后将其与谷歌API客户端库一起上传到php文件夹http://www.MYSERVER.com/script1.php,以检索Auth代码:

<?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时,我允许授权并获得可以在第二个脚本中编写的验证代码。然后我把它上传到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);
?>

现在文件Drive .txt上传到我的Google Drive和token的结构。Json文件是一种:

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

现在,您可以想象,我可以调用script2.php并上传文件,直到某个时间。最后,重点是:我不希望令牌过期,我不希望每次令牌过期时都允许授权(回想script1.php):我需要在白天定期调用script2.php,以便自动上传我的文件,无需用户交互。那么,在这种情况下,自动永久刷新令牌的最佳方法是什么?我需要另一个脚本吗?我可以添加一些代码到script2.php吗?或者修改令牌。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"];

对于将来的请求,确保总是设置刷新令牌:

$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 classn";
        $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

相关内容

  • 没有找到相关文章