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

使用Google Client API服务账号连接Google Workspace时遭遇redirect_uri_mismatch错误的技术咨询

解决服务账号域级委派中的redirect_uri_mismatch问题

嘿,你这明显踩了个服务账号使用的常见坑——把普通OAuth2的授权流程和服务账号的域级全域权限委派逻辑混在一起啦!这就是redirect_uri_mismatch错误的根源,我来给你捋清楚怎么解决:

为什么会出现这个错误?

普通OAuth2应用需要配置redirect_uri来完成授权码回调,但服务账号的域级委派完全不需要走用户跳转登录的授权码流程。它是通过JSON密钥文件+模拟域内指定用户的方式直接获取访问令牌的,自然不存在配置redirect_uri的入口——因为这个流程本身就不需要它。你当前的脚本还保留了普通OAuth应用的跳转授权逻辑,这才导致了不匹配错误。

修正后的服务账号认证脚本

把你的auth.php改成下面这样,去掉所有和授权码流程相关的冗余代码:

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

$credentials_file = "credentials_service_account.json"; // 你的服务账号密钥文件
$target_user_email = "admin@your-domain.com"; // Workspace域内的管理员账号,用来模拟操作其他用户

$client = new Google_Client();
$client->setApplicationName("Email Signature Management");
$client->setAuthConfig($credentials_file);
// 设置要模拟的域内用户(必须是域内有效账号,用管理员账号才能操作其他用户)
$client->setSubject($target_user_email);
// 确保权限范围包含你需要的所有API权限
$client->setScopes([
    "https://www.googleapis.com/auth/directory.readonly",
    "https://www.googleapis.com/auth/gmail.settings.basic",
    "https://www.googleapis.com/auth/gmail.settings.sharing"
]);

// 服务账号会自动生成并刷新令牌,无需手动处理授权码和跳转
$accessToken = $client->fetchAccessTokenWithAssertion();
if (array_key_exists('error', $accessToken)) {
    throw new Exception(join(', ', $accessToken));
}
$client->setAccessToken($accessToken);

// 现在可以用这个client调用API操作其他用户了,比如获取用户列表或修改邮箱签名
var_dump($client);

关键配置检查项

确保你之前的配置步骤都正确完成:

  • 服务账号已启用全域权限委派,并且下载了正确的JSON密钥文件
  • 在Google Workspace管理控制台的「安全>API设置>域级委派」中,添加了服务账号的客户端ID,并且授权了你脚本中指定的所有权限范围
  • setSubject中填写的邮箱必须是你Workspace域内的有效账号,且该账号拥有足够权限(比如管理员权限)来修改其他用户的邮箱签名

这样修改后,访问脚本就不会再跳转到Google授权页面,也不会出现redirect_uri不匹配的错误了,同时能正常实现跨用户的邮箱签名修改功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:12:40