当前位置: 首页 > 知识库问答 >
问题:

使用带有php脚本的google drive api自动刷新令牌

桑坚成
2023-03-14

我再次按照本教程使用php在Google Drive上上传了一个文件,直接从我的远程服务器上:因此,我从Google API控制台创建了新的API项目,启用了Drive API服务,请求了OAuth客户端ID和客户端机密,将它们写在脚本中,然后将其与Google APIs客户端库for 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时,我允许授权并获得可以在第二个脚本中编写的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);

?>

好了,现在文件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文件?在令牌过期之前,我可以在哪里读取剩余的时间?谢了!

共有1个答案

高修伟
2023-03-14

您不必周期性地请求访问令牌。如果您有refresh_token,PHP客户端将自动为您获取一个新的访问令牌。

为了检索refresh_token,您需要将access_type设置为“脱机”并请求脱机访问权限:

$drive->setAccessType('offline');

一旦获得代码,

$_GET['code']= 'X/XXX';
$drive->authenticate();

// persist refresh token encrypted
$refreshToken = $drive->getAccessToken()["refreshToken"];

对于以后的请求,请确保始终设置刷新的令牌:

$tokens = $drive->getAccessToken();
$tokens["refreshToken"] = $refreshToken;
$drive->setAccessToken(tokens);
$drive->refreshToken($refreshToken);

注意,refresh_token将只在第一个$drive->authenticate()时返回,您需要永久存储它。为了获得一个新的refresh_token,您需要撤消现有的token,并再次启动auth进程。

离线访问在Google的OAuth2.0文档中有详细解释。

 类似资料:
  • null 我目前拥有的是以下内容:当密码哈希和用户名在数据库中匹配时,刷新令牌endpoint生成一个JWT。每个刷新令牌都有一个存储在数据库中的jti,以及过期(仅用于DB清理)、device_id和一个revoked标志。可以使用refresh令牌命中另一个endpoint,该令牌返回一个JWT访问令牌。访问令牌的有效期为15分钟。无法吊销访问令牌。 我的问题出现在需求1上。我不希望用户在与网

  • 在我的Java/Ionic2应用程序中,我通过REST服务请求使用刷新令牌对Google Drive进行身份验证,然后使用access_type=offline,如下所述:https://developers.Google.com/identity/protocols/oauth2webserver#refresh。 服务器响应200 OK,所以它给我一个刷新和一个访问令牌,只是在我第一次请求访问

  • 我有一个表用户,我需要不断上传,所以一旦更新,我想直接重新启动命令。 实际上,我使用的是一个cron,它每分钟都会用Laravel启动自己(

  • 问题内容: 我正在使用Firebase电子邮件/密码身份验证。用户成功登录后,我将通过以下方式查询访问令牌: 根据Firebase文档,访问令牌会在1小时后过期。为了处理在我的应用程序中始终具有当前访问令牌的情况,我在寻找解决方案,并且在firebase文档中发现我必须注册Firebase.IdTokenListener来侦听 onIdTokenChanged事件 我的问题是 : onIdToke

  • onIdTokenChanged事件 我的问题是: onIdTokenChanged事件 IDTokenListener 被触发。但这不是我要找的。