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

使用服务账户调用Google Forms API时遇401认证错误的解决问询

解决Google Forms API服务账户认证401错误的方案

核心问题排查与解决步骤

1. 必须将目标表单共享给服务账户邮箱

这是最容易忽略的关键步骤:服务账户是独立的身份实体,默认无法访问你的Google Workspace或个人名下的表单。

  • 打开目标Google表单,点击右上角「共享」按钮
  • 输入服务账户的邮箱(可在service-account.json文件的client_email字段中找到)
  • 至少赋予查看者权限(若需要修改表单则选择编辑者)

2. 简化并验证权限范围

你的代码中存在重复的Drive权限范围,且Forms范围可按需精简,避免不必要的权限干扰:

$client = new \Google_Client();
// 仅保留Forms相关必要范围
$client->setScopes([
    \Google\Service\Forms::FORMS_BODY_READONLY,
    \Google\Service\Forms::FORMS_RESPONSES_READONLY
]);
// 替代putenv,直接指定认证文件路径更可靠
$client->setAuthConfig(storage_path('google-api-credentials/service-account.json'));
$client->useApplicationDefaultCredentials(true);
$client->setAccessType('offline');

3. 调试认证状态,确认令牌获取

添加调试代码,验证客户端是否成功获取到访问令牌:

$service = new \Google_Service_Forms($client);
// 打印令牌信息,检查是否存在有效的access_token
var_dump($client->getAccessToken());

如果没有返回有效令牌,检查:

  • 服务账户JSON文件路径是否正确
  • 文件权限是否允许PHP读取

4. 确认Forms API已在开发者控制台启用

登录Google开发者控制台,进入你的项目:

  • 导航到「API和服务」→「库」
  • 搜索「Google Forms API」,确认其状态为「已启用」

常见疑问解答

  • 是否需要手动执行OAuth步骤? 不需要。服务账户认证完全支持Forms API,无需走用户授权流程。
  • 是否是权限缺失? 除了表单共享权限,无需额外在Workspace中配置特殊权限,只要Forms API启用且表单共享给服务账户即可。

内容的提问来源于stack exchange,提问作者Anthony Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:06:28