You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PHP无需共享账号密码访问指定普通Google Drive账号

如何用PHP访问普通Google账号Drive文件(无需共享密码)

核心方案是使用OAuth2授权码模式+离线访问权限:由账号管理员(你的办公室主管)完成一次授权操作,之后PHP程序通过保存的刷新令牌自动获取访问令牌,实现长期无密码访问目标账号的Drive资源,同时不影响主管正常使用网页端管理文件。

具体实现步骤

1. 配置Google Cloud项目与OAuth客户端

  • 登录Google Cloud控制台,创建新项目并启用「Google Drive API」
  • 进入「API和服务」→「凭据」,创建「OAuth 2.0客户端ID」,应用类型选择桌面应用(后台脚本无需公开重定向URL)
  • 在「OAuth同意屏幕」中,将主管的账号office-0004@my-nice-company.com添加为「测试用户」(未验证的应用仅测试用户可授权)

2. 生成初始授权码与刷新令牌(仅需主管操作一次)

编写临时PHP脚本生成授权URL,让主管在自己的设备上打开并完成授权:

require __DIR__ . '/vendor/autoload.php';

$client = new Google\Client();
$client->setClientId('你的OAuth客户端ID');
$client->setClientSecret('你的OAuth客户端密钥');
$client->setScopes([Google\Service\Drive::DRIVE_FILE]); // 按需调整权限,比如仅访问指定文件夹可缩小范围
$client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob'); // 桌面应用的默认重定向
$client->setAccessType('offline'); // 开启离线访问,获取刷新令牌

$authUrl = $client->createAuthUrl();
echo "请复制此URL在浏览器打开,登录主管账号并授权:\n$authUrl\n";
echo "输入授权码:";
$authCode = trim(fgets(STDIN));

// 交换授权码为令牌
$token = $client->fetchAccessTokenWithAuthCode($authCode);
// 保存刷新令牌到安全位置(比如加密的配置文件或环境变量)
file_put_contents('refresh_token.json', json_encode($token));

主管完成授权后,脚本会生成包含refresh_token的文件,将此文件妥善保管,不要分享给其他员工。

3. 编写PHP长期访问代码

后续程序通过刷新令牌自动获取访问令牌,无需再次授权:

require __DIR__ . '/vendor/autoload.php';

$client = new Google\Client();
$client->setClientId('你的OAuth客户端ID');
$client->setClientSecret('你的OAuth客户端密钥');
$client->setScopes([Google\Service\Drive::DRIVE_FILE]);
$client->setAccessType('offline');

// 加载保存的令牌
$token = json_decode(file_get_contents('refresh_token.json'), true);
$client->setAccessToken($token);

// 如果访问令牌过期,自动用刷新令牌更新
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    // 保存更新后的令牌
    file_put_contents('refresh_token.json', json_encode($client->getAccessToken()));
}

// 初始化Drive服务
$driveService = new Google\Service\Drive($client);
// 示例:列出指定文件夹下的文件
$folderId = '目标文件夹ID';
$results = $driveService->files->listFiles([
    'q' => "'$folderId' in parents",
    'fields' => 'files(id, name)'
]);

4. 结合FlySystem Google Drive适配器

使用league/flysystem-google-drive-v2或v3适配器,传入已配置好的$driveService实例即可:

use League\Flysystem\Filesystem;
use League\Flysystem\GoogleDrive\GoogleDriveAdapter;

$adapter = new GoogleDriveAdapter($driveService, $folderId);
$filesystem = new Filesystem($adapter);

// 示例:上传文件到Drive
$filesystem->write('test.txt', 'Hello from FlySystem!');

解决你的核心顾虑

  • 无需共享账号密码:仅主管完成一次授权,程序仅保存刷新令牌(可加密存储),员工无法接触到账号凭证
  • 主管正常使用网页端:授权操作不会影响账号的网页端访问,手动上传、管理文件的流程完全不受影响
  • 权限可控:可通过调整OAuth的权限范围(比如仅DRIVE_FILE而非全DRIVE),限制程序仅能访问指定文件夹或文件

内容的提问来源于stack exchange,提问作者Xavi Montero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:23:20