如何让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
相关产品推荐
相关产品推荐

