谷歌应用引擎项目和谷歌群组都在GSuite域内。 源代码在这里,请参见firestore2ggroup.php。
我的问题与安全有关,当我尝试调用API时,我会收到403错误,而没有其他细节。
{
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Not Authorized to access this resource/api"
}
],
"code": 403,
"message": "Not Authorized to access this resource/api"
}
}
我按照这里描述的步骤作为起点,因为它与我的需求相近:
https://medium.com/@Skaaptjop/access-gsuite-apis-on-your-domain-using-a-service-account-e2a8dbda287c
因此,我按照以下步骤进行了操作:
在Google Cloud Console中:
- 部署Google App Engine项目
- 转到IAM,服务帐户,复制GAE服务帐户的唯一密钥并启用“域宽委派”
- 创建JSON私钥
- 使用“服务目录管理员”(以及Cloud Data Store用户用于Firestore)更新服务帐户
在GSuite管理者中:
- 以域的管理员身份连接到admin.google.com
- 转到Security,然后是“高级设置”,再是“管理API客户端访问”
- 添加一个
- 将服务帐户唯一标识粘贴为客户端名称
- https://www.googleapis.com/auth/admin.directory.group.member(查看和管理您域上的组订阅)
更新:我甚至尝试添加更多权限,但仍然无法正常工作:
在我的项目中,我复制了JSON私钥,并在app.yaml中设置了变量GOOGLE_APPLICATION_CREDENTIALS和文件名。我使用了Google库来访问Google组:composer require google/apiclient:^2.0。try
{
$client = new Google_Client();
$client->setApplicationName('Pegass2GGroup');
$client->setScopes(
[
Google_Service_Directory::ADMIN_DIRECTORY_GROUP,
Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER,
Google_Service_Directory::ADMIN_DIRECTORY_USER
]);
$client->useApplicationDefaultCredentials(true);
$access_token = $client->fetchAccessTokenWithAssertion();
print_r($access_token);
$service = new Google_Service_Directory($client);
/** @var $members Google_Service_Directory_Members */
$members = $service->members->listMembers($MAILING_LIST);
/** @var $member Google_Service_Directory_Member */
foreach ($members as $member)
{
print_r($member->getEmail());
}
echo "</pre>";
}
catch(Exception $e)
{
print_r($e);
echo "</pre>";
}
我可以告诉私钥已经加载,因为print_r($e)返回了一个长的异常并且密钥被列出。 print_r($access_token); 返回以下内容:
Array
(
[access_token] => dag2qssffdVpRZEr...0BsM_QUgQ
[expires_in] => 3599
[token_type] => Bearer
[created] => 1586787451
)
$MAILING_LIST:是邮件列表的完整电子邮件地址