
本教程详细介绍了如何使用php和google admin sdk通过服务账户(service account)和域范围授权(domain-wide delegation)来获取特定用户所属的google群组列表。文章涵盖了客户端配置、权限设置、oauth流程以及如何正确进行用户模拟,以解决常见的`unauthorized_client`错误,确保api调用的成功。
在Google Workspace环境中,通过编程方式管理用户和群组是常见的需求。本教程将指导您如何使用PHP客户端库和Google Admin SDK来列出特定用户所属的所有Google群组。我们将重点讲解如何正确配置服务账户和域范围授权,以克服常见的认证和授权问题。
在开始编写PHP代码之前,您需要完成以下准备工作:
composer require google/apiclient
本节将分步介绍如何在PHP中初始化Google客户端,并执行两阶段认证:首先通过OAuth2获取当前登录用户的基本信息,然后切换到服务账户模拟该用户来执行Admin SDK操作。
首先,我们需要让用户通过OAuth2登录,以获取他们的邮箱地址。这个邮箱地址稍后将用于服务账户模拟。
<?php
require 'vendor/autoload.php'; // 根据您的项目路径调整
// 创建新的Google客户端实例
$client = new Google_Client();
// 设置您的客户端ID、客户端密钥和重定向URL
// 这些信息从Google Cloud Console的OAuth 2.0客户端ID中获取
$client->setClientId('YOUR_CLIENT_ID.apps.googleusercontent.com');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URL'); // 必须与Google Cloud Console中配置的URL一致
$client->setApplicationName("My Google Group Lister");
// 添加获取用户邮箱和资料信息的OAuth范围
$client->addScope("https://www.googleapis.com/auth/userinfo.email");
$client->addScope("https://www.googleapis.com/auth/userinfo.profile");
// 处理OAuth回调
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
if (!isset($token["error"])) {
$client->setAccessToken($token['access_token']);
// 获取用户基本信息
$google_oauth = new Google_Service_Oauth2($client);
$google_account_info = $google_oauth->userinfo->get();
$userEmail = $google_account_info->email; // 获取当前登录用户的邮箱
echo "当前登录用户邮箱: " . $userEmail . "<br>";
// ... 接下来将进行服务账户模拟操作
} else {
echo "OAuth认证失败: " . $token["error_description"];
}
} else {
// 如果没有code参数,则重定向到Google认证页面
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit();
}
?>在获取到用户邮箱后,我们将切换到使用服务账户进行认证,并模拟该用户来调用Admin SDK。这是获取群组列表的关键步骤。
<?php
// ... 承接上面的代码,在 $userEmail 变量获取之后 ...
// 配置服务账户认证
// 加载您的服务账户JSON密钥文件路径
$client->setAuthConfig('PATH_TO_YOUR_SERVICE_ACCOUNT_KEY.json');
// 指定要模拟的用户邮箱。
// 这个邮箱必须是Google Workspace域内的有效用户,
// 并且该服务账户已通过域范围授权获得了相应的权限。
$client->setSubject($userEmail); // 模拟当前登录的用户
// 添加Admin SDK所需的OAuth范围
// 注意:这个范围也必须在Google Workspace管理控制台的域范围授权中配置
$client->addScope("https://www.googleapis.com/auth/admin.directory.group.readonly");
// ... 接下来将进行获取群组列表的操作
?>重要提示:
芦笋演示
一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。
227
查看详情
现在,我们已经正确配置了客户端并进行了认证,可以使用Google_Service_Directory服务来查询用户所属的群组。
<?php
// ... 承接上面的代码 ...
// 初始化Directory服务
$service = new Google_Service_Directory($client);
// 设置查询参数,列出指定用户所属的群组
$optParams = array(
'domain' => 'YOUR_DOMAIN.com', // 替换为您的Google Workspace域名
'userKey' => $userEmail // 使用要查询的用户邮箱
);
try {
// 调用Admin SDK的groups->listGroups方法
$googleGroups = $service->groups->listGroups($optParams);
$groups = $googleGroups->getGroups();
if (!empty($groups)) {
echo "<h3>用户 " . $userEmail . " 所属的群组:</h3>";
echo "<ul>";
foreach ($groups as $group) {
echo "<li>" . $group->getEmail() . " (" . $group->getName() . ")</li>";
}
echo "</ul>";
} else {
echo "用户 " . $userEmail . " 不属于任何群组。";
}
} catch (Google_Service_Exception $e) {
echo "获取群组时发生错误: " . $e->getMessage();
// 详细错误信息可能在 $e->getErrors() 中
}
// ...
?>将上述所有部分整合,形成一个完整的PHP脚本:
<?php
require 'vendor/autoload.php';
// 创建新的Google客户端实例
$client = new Google_Client();
// --- 第一阶段:用户OAuth2认证,获取用户基本信息 ---
// 设置您的客户端ID、客户端密钥和重定向URL
$client->setClientId('YOUR_CLIENT_ID.apps.googleusercontent.com');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URL');
$client->setApplicationName("My Google Group Lister");
// 添加获取用户邮箱和资料信息的OAuth范围
$client->addScope("https://www.googleapis.com/auth/userinfo.email");
$client->addScope("https://www.googleapis.com/auth/userinfo.profile");
$userEmail = null;
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
if (!isset($token["error"])) {
$client->setAccessToken($token['access_token']);
// 获取用户基本信息
$google_oauth = new Google_Service_Oauth2($client);
$google_account_info = $google_oauth->userinfo->get();
$userEmail = $google_account_info->email; // 获取当前登录用户的邮箱
echo "当前登录用户邮箱: " . $userEmail . "<br>";
// --- 第二阶段:服务账户模拟用户,执行Admin SDK操作 ---
// 配置服务账户认证
// 加载您的服务账户JSON密钥文件路径
$client->setAuthConfig('PATH_TO_YOUR_SERVICE_ACCOUNT_KEY.json');
// 指定要模拟的用户邮箱
$client->setSubject($userEmail);
// 添加Admin SDK所需的OAuth范围
$client->addScope("https://www.googleapis.com/auth/admin.directory.group.readonly");
// 初始化Directory服务
$service = new Google_Service_Directory($client);
// 设置查询参数,列出指定用户所属的群组
$optParams = array(
'domain' => 'YOUR_DOMAIN.com', // 替换为您的Google Workspace域名
'userKey' => $userEmail // 使用要查询的用户邮箱
);
try {
// 调用Admin SDK的groups->listGroups方法
$googleGroups = $service->groups->listGroups($optParams);
$groups = $googleGroups->getGroups();
if (!empty($groups)) {
echo "<h3>用户 " . $userEmail . " 所属的群组:</h3>";
echo "<ul>";
foreach ($groups as $group) {
echo "<li>" . $group->getEmail() . " (" . $group->getName() . ")</li>";
}
echo "</ul>";
} else {
echo "用户 " . $userEmail . " 不属于任何群组。";
}
} catch (Google_Service_Exception $e) {
echo "获取群组时发生错误: " . $e->getMessage() . "<br>";
echo "详细错误: " . print_r(json_decode($e->getMessage(), true), true);
}
} else {
echo "OAuth认证失败: " . $token["error_description"];
}
} else {
// 如果没有code参数,则重定向到Google认证页面
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit();
}
?>请务必将代码中的 YOUR_CLIENT_ID.apps.googleusercontent.com、YOUR_CLIENT_SECRET、YOUR_REDIRECT_URL、PATH_TO_YOUR_SERVICE_ACCOUNT_KEY.json 和 YOUR_DOMAIN.com 替换为您的实际值。
通过本教程,您应该已经掌握了如何使用PHP和Google Admin SDK,结合服务账户和域范围授权来获取特定用户所属的Google群组列表。关键在于正确配置Google Cloud项目、服务账户、域范围授权,并在PHP代码中分阶段进行认证:首先通过OAuth2获取用户身份,然后利用服务账户模拟该用户来执行Admin SDK操作。遵循这些步骤将有效避免常见的认证和授权问题,确保您的应用程序能够顺利与Google Workspace API交互。
以上就是PHP集成Google Admin SDK:通过服务账户列出用户所属群组的教程的详细内容,更多请关注php中文网其它相关文章!
# 这是
# 益智玩具营销推广方案
# 网站推广价格有区别没
# 国外网络营销推广获客
# html5标签与seo
# 婚庆网站建设定制
# 凌海seo网站营销推广
# 如何提升seo技能
# 智能营销网站怎么做推广
# 奉化网站建设哪里找
# 大渡口网站推广费用
# 所需
# 邮箱地址
# 创建一个
# 如何使用
# 该用户
# php
# 重定向
# 客户端
# 群组
# 您的
# php脚本
# api调用
# 邮箱
# google
# ai
# access
# app
# composer
# go
# json
# js
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
VB表达式书写规则解析
优化CSS动画与J*aScript定时器协同:构建稳定Toast提示
谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法
mysql如何配置从库只读_mysql从库只读设置方法
美发店速赢秘籍
PHP动态导航按钮:根据用户登录状态切换链接与文本
mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法
如何测试您的网站全球打开速度-网站海外测速工
多闪电脑版下载_多闪PC端模拟器使用
4399小游戏下装链接 4399小游戏下载链接入口
iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南
圆通快递官网入口查询单号 手机版官方查询入口
猫眼app抢票快还是小程序快
有道AI翻译入口 智能写作官方网站入口
PHP中实现JSON数据数组分页的教程
《爱南宁》认证电动车方法
铁路12306怎么申请退票_铁路12306退票申请操作流程
b站怎么用微信登录_b站微信登录方法
QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航
C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
盲鳗善于分泌黏液猜猜主要用来做什么
126邮箱申请入口官网_126邮箱注册免费登录2025
阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口
PHP中动态类名访问的类实例类型提示与静态分析实践
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
多闪APP官方下载安装入口_多闪最新版本获取入口
稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口
b站怎么查看视频的码率_b站视频码率查看方法
《花瓣》创建专辑方法
《鹿路通》退余额方法
c++如何链接Boost库_c++准标准库的集成与使用
c++类和对象到底是什么_c++面向对象编程基础
Three.js中动态更换3D模型纹理的教程
sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码
追剧达人如何发弹幕
GBA模拟器手柄按键设置
漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口
学习通网页版个人登录_学习通网页版个人账户登录入口
《雷电模拟器》截图方法介绍
解决C#跨线程访问XML对象的异常 安全的并发XML处理模式
百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法
视频转蓝光m2ts格式
小红书网页版首页入口 小红书网页版电脑端官方登录链接
mysql数据库索引类型有哪些_mysql索引类型解析
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
解决CSS background 属性中 cover 关键字的常见误用
《广发易淘金》国债逆回购操作教程
Final Cut Pro视频加EQ教程
windows10怎么设置电源按钮_windows10按下电源键功能修改
2025-12-05
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。