如何通过终端完成Google API OAuth2.0认证?(PHP调用场景)
当然可以通过终端完成Google API的OAuth2.0认证!我之前帮不少开发者解决过类似的Google Photos API终端认证问题,给你一套亲测有效的操作方案:
一、先搞定环境与依赖准备
- 确保你的PHP项目已经安装了Google官方的客户端库,用Composer安装的话,终端执行:
composer require google/apiclient:^2.0 - 检查PHP的curl扩展是否启用,终端输入
php -m | grep curl,能看到curl字样就说明没问题,要是没看到得先开启这个扩展。
二、把OAuth2配置改成终端适配的模式
原来的Web端认证是跳浏览器的,终端没有浏览器环境,所以得用设备授权流(Device Authorization Flow)。你需要修改PHP代码里的认证逻辑,替换成下面的示例代码:
<?php require __DIR__ . '/vendor/autoload.php'; // 初始化Google客户端 $client = new Google\Client(); $client->setApplicationName('Google Photos 终端测试'); // 这里根据你的需求改权限,比如只读就用PHOTOSLIBRARY_READONLY $client->setScopes([Google\Service\PhotosLibrary::PHOTOSLIBRARY_READONLY]); // 加载你从Google Cloud下载的密钥文件 $client->setAuthConfig('credentials.json'); $client->setAccessType('offline'); // 允许获取刷新令牌,下次不用重复认证 $client->setPrompt('select_account consent'); // 切换到设备授权流逻辑 $oauthService = $client->getOAuth2Service(); $deviceAuthResponse = $oauthService->deviceCode()->create([ 'client_id' => $client->getClientId() ]); // 输出终端提示信息 echo "请在浏览器中打开以下链接:\n" . $deviceAuthResponse['verification_url'] . "\n"; echo "输入验证码:" . $deviceAuthResponse['user_code'] . "\n"; echo "请完成账号登录与授权,我会在这里等待...\n"; // 轮询获取访问令牌 $accessToken = null; $interval = $deviceAuthResponse['interval']; while (true) { try { $accessToken = $client->fetchAccessTokenWithAuthCode($deviceAuthResponse['device_code']); break; } catch (Google\Exception $e) { // 授权还在处理中,等待指定时间后重试 if ($e->getCode() === 400 && str_contains($e->getMessage(), 'authorization_pending')) { sleep($interval); continue; } // 其他错误直接抛出 throw $e; } } // 把令牌保存到本地,下次执行脚本直接加载,不用再认证 file_put_contents('token.json', json_encode($accessToken)); $client->setAccessToken($accessToken); // 接下来就可以调用Google Photos API了,比如获取相册列表 $photosService = new Google\Service\PhotosLibrary($client); $albums = $photosService->albums->listAlbums(); echo "\n获取到的相册列表:\n"; foreach ($albums as $album) { echo "- " . $album->getTitle() . "\n"; }
三、终端执行与认证的具体步骤
- 先去Google Cloud控制台,创建一个桌面应用类型的OAuth客户端ID,下载对应的
credentials.json文件,放到你的PHP脚本同一目录下(注意:不能用Web应用类型的客户端ID,否则设备流会报错)。 - 终端切换到脚本所在目录,执行
php your-script-name.php(把your-script-name换成你的PHP文件名)。 - 按照终端里的提示,打开给出的链接,在浏览器里登录你的Google个人账号,输入显示的验证码,完成授权。
- 回到终端,等待几秒,脚本会自动获取到令牌并保存为
token.json,之后再执行脚本就不用重复走认证流程了。
四、常见问题排查
- 如果提示
client_id无效:检查你的credentials.json是不是桌面应用类型的,Web应用的客户端ID不支持设备授权流。 - 如果出现权限不足的错误:确认你在Google Cloud控制台的OAuth同意屏幕里,已经添加了需要的权限(比如
photoslibrary.readonly),并且你的账号已经完成了授权同意。 - 如果Composer依赖报错:执行
composer dump-autoload重新加载自动加载文件,或者重新安装依赖。
内容的提问来源于stack exchange,提问作者flixy
相关产品推荐
相关产品推荐

