Hux*_*ley 8 php google-api google-drive-api google-api-php-client
我再次跟踪本教程,使用php直接从我的REMOTE SERVER上传Google文件:所以我从Google API控制台创建了新的API项目,启用了Drive API服务,请求了OAuth客户端ID和客户端密钥,并在脚本,然后将其与Google API Client Library for 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);
?>
Run Code Online (Sandbox Code Playgroud)
当我访问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);
?>
Run Code Online (Sandbox Code Playgroud)
好吧,现在文件drive.txt上传到我的Google云端硬盘上,而token.json文件的结构是这样的:
{"access_token":"XXX","token_type":"Bearer","expires_in":3600,"refresh_token":"YYY","created":1365505148}
Run Code Online (Sandbox Code Playgroud)
现在,你可以想象我可以调用script2.php并上传文件直到某个时间.最后,重点是:我不希望令牌过期,我不希望每次过期都允许授权(调用script1.php):我需要在白天定期调用script2.php,上传我的文件自动,没有用户交互.那么,在这种情况下永久自动刷新令牌的最佳方法是什么?我需要另一个脚本吗?我可以在script2.php中添加一些代码吗?或修改token.json文件?在令牌到期之前,我在哪里可以读取剩余的时间?谢谢!
Bur*_*gan 30
您不必定期请求访问令牌.如果您有refresh_token,PHP客户端将自动为您获取新的访问令牌.
要检索refresh_token,您需要将access_type设置为"offline"并要求离线访问权限:
$drive->setAccessType('offline');
Run Code Online (Sandbox Code Playgroud)
一旦你得到了code,
$_GET['code']= 'X/XXX';
$drive->authenticate();
// persist refresh token encrypted
$refreshToken = $drive->getAccessToken()["refreshToken"];
Run Code Online (Sandbox Code Playgroud)
对于将来的请求,请确保始终设置刷新的令牌:
$tokens = $drive->getAccessToken();
$tokens["refreshToken"] = $refreshToken;
$drive->setAccessToken(tokens);
Run Code Online (Sandbox Code Playgroud)
如果您想要强制访问令牌刷新,可以通过调用refreshToken:
$drive->refreshToken($refreshToken);
Run Code Online (Sandbox Code Playgroud)
当心,refresh_token只会在第一次退货$drive->authenticate(),你需要永久存储它.要获取新的refresh_token,您需要撤消现有令牌并再次启动身份验证过程.
Google的OAuth 2.0文档详细说明了离线访问.
| 归档时间: |
|
| 查看次数: |
27489 次 |
| 最近记录: |