使用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
相关产品推荐
相关产品推荐

