
Google Drive API采用OAuth2协议进行身份验证和授权。OAuth2是一种开放标准,允许第三方应用程序在不获取用户密码的情况下,访问用户在其他服务提供商(如Google)上的受保护资源。对于自动化项目,理解其核心流程至关重要:
对于需要自动化、无人值守运行的Google Drive项目,核心在于获取并妥善管理刷新令牌。
要实现离线访问,您在首次用户授权时必须明确请求access_type='offline'和prompt='select_account consent'。这确保了Google会颁发刷新令牌,并强制用户在首次授权时选择账户并同意权限,即使之前已经授权过。
以下是一个获取刷新令牌并将其保存到文件中的示例PHP代码。在实际生产环境中,建议将刷新令牌存储在加密的数据库或安全的配置管理系统中,而不是明文文件。
<?php
require __DIR__ . '/vendor/autoload.php'; // 引入Google API客户端库
session_start();
$client = new Google_Client();
$client->setApplicationName('Google Drive API PHP Quickstart');
$client->setRedirectUri('http://localhost/generate_refresh_token.php'); // 设置回调URI,应指向此脚本自身
$client->setScopes(Google_Service_Drive::DRIVE); // 请求Google Drive的全部访问权限
$client->setAuthConfig('credentials.json'); // 您的Google Cloud项目凭据文件
$client->setAccessType('offline'); // 关键:请求离线访问,以获取刷新令牌
$client->setPrompt('select_account consent'); // 关键:强制用户选择账户并同意权限
// 1. 处理回调:当Google将授权码返回时
if (isset($_GET['code'])) {
try {
$client->authenticate($_GET['code']); // 使用授权码交换访问令牌和刷新令牌
$accessToken = $client->getAccessToken();
// 检查是否获得了刷新令牌
if (isset($accessToken['refresh_token'])) {
$refreshToken = $accessToken['refresh_token'];
// 将刷新令牌保存到持久化存储中
// 生产环境应考虑更安全的存储方式,如加密数据库
file_put_contents('refresh_token.txt', $refreshToken);
echo "刷新令牌已成功获取并保存!<br>";
echo "请妥善保管 refresh_token.txt 文件。<br>";
} else {
echo "未获取到刷新令牌。请确保 setAccessType('offline') 已设置,且是首次授权或强制同意。<br>";
}
// 可以选择将完整的访问令牌保存到会话或临时文件,以便立即使用
$_SESSION['access_token'] = $accessToken;
// 重定向以清除URL中的授权码
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
exit();
} catch (Exception $e) {
echo "认证失败: " . $e->getMessage();
}
}
// 2. 引导用户进行授权
if (!$client->getAccessToken()) { // 如果当前没有有效的访问令牌
$authUrl = $client->createAuthUrl();
echo "请点击以下链接进行首次授权:<br>";
echo "<a href='$authUrl'>授权我的Google Drive账户</a>";
} else {
echo "已成功认证。如果您需要重新获取刷新令牌,请先注销。<br>";
echo "<a href='?logout'>注销</a>";
}
// 3. 处理注销请求
if (isset($_REQUEST['logout'])) {
unset($_SESSION['access_token']);
$client->revokeToken();
header('Location: ' . filter_var($client->getRedirectUri(), FILTER_SANITIZE_URL));
exit();
}
?>注意事项:
一旦您获得了刷新令牌并将其持久化存储,您就可以在任何需要调用Google Drive API的自动化脚本中使用它来获取新的访问令牌,而无需用户再次干预。
以下是一个示例,展示了如何加载保存的刷新令牌,并用它来获取新的访问令牌,然后执行一个简单的Google Drive API操作(例如,列出文件)。
<?php
require __DIR__ . '/vendor/autoload.php'; // 引入Google API客户端库
$client = new Google_Client();
$client->setApplicationName('Google Drive API PHP Quickstart');
$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY); // 根据需要设置合适的权限范围
$client->setAuthConfig('credentials.json'); // 您的Google Cloud项目凭据文件
$refreshTokenPath = 'refresh_token.txt'; // 刷新令牌的存储路径
// 1. 加载保存的刷新令牌
if (!file_exists($refreshTokenPath)) {
die("错误:未找到刷新令牌文件。请先运行 generate_refresh_token.php 进行首次授权。\n");
}
$refreshToken = trim(file_get_contents($refreshTokenPath));
// 2. 使用刷新令牌获取新的访问令牌
try {
$client->fetchAccessTokenWithRefreshToken($refreshToken);
$accessToken = $client->getAccessToken();
if (empty($accessToken) || !isset($accessToken['access_token'])) {
die("错误:无法使用刷新令牌获取访问令牌。刷新令牌可能已失效或被撤销。\n");
}
// 3. 设置新的访问令牌,准备进行API调用
$client->setAccessToken($accessToken);
// 4. 执行Google Drive API操作
$service = new Google_Service_Drive($client);
$files = $service->files->listFiles([
'pageSize' => 10,
'fields' => 'nextPageToken, files(id, name)'
]);
if (empty($files->getFiles())) {
echo "在您的Google Drive中未找到文件。\n";
} else {
echo "您的Google Drive中的文件:\n";
foreach ($files->getFiles() as $file) {
printf("- %s (%s)\n", $file->getName(), $file->getId());
}
}
} catch (Google\Service\Exception $e) {
// 捕获Google API服务异常,例如权限不足、令牌无效等
echo "Google Drive API错误: " . $e->getMessage() . "\n";
// 如果错误是关于刷新令牌失效,可能需要重新进行首次授权
if (strpos($e->getMessage(), 'invalid_grant') !== false) {
echo "提示:刷新令牌可能已失效。请重新运行 generate_refresh_token.php 进行授权。\n";
}
} catch (Exception $e) {
// 捕获其他PHP异常
echo "发生未知错误: " . $e->getMessage() . "\n";
}
?>关键点:
通过妥善利用Google OAuth2中的刷新令牌机制,开发者可以轻松实现Google Drive API的自动化、无人值守访问。核心在于首次授权时获取并安全保存刷新令牌,然后在后续的自动化任务中利用该刷新令牌周期性地获取新的访问令牌。遵循上述指南和最佳实践,将确保您的Google Drive自动化项目稳定、高效地运行。
以上就是Google Drive API 访问令牌自动化:实现持久化离线授权的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号