使用Google App Engine应用程序更新Google网上论坛订阅

问题描述 投票:2回答:1

我正在Google App Engine(PHP)上构建一个小型应用程序,旨在将外部源与google组同步,以获取最新的邮件列表。 (它应作为GAE cron任务运行)

Google App Engine项目和google组位于GSuite域中。

The sources are here,请参阅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私钥
    • 使用“服务目录管理员”(和Firestore的Cloud Data Store用户)更新服务帐户
  • 在GSuite管理员中:

    • 以域的管理员身份连接到admin.google.com
    • 转到安全,然后依次单击“高级设置”和“管理API客户端访问”
    • 添加一个
    • 将服务帐户唯一ID粘贴为客户端名称
    • [https://www.googleapis.com/auth/admin.directory.group.member(在您的域上查看和管理组订阅)] >>
  • 更新:我什至尝试添加更多权限,但仍然无法正常工作:

enter image description here

在我的项目中,我复制了JSON私钥,并在app.yaml中设置了变量GOOGLE_APPLICATION_CREDENTIALS和文件名。

我使用此Google lib访问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:是邮件列表的完整电子邮件地址

我正在Google App Engine(PHP)上构建一个小型应用程序,旨在将外部源与google组同步,以获取最新的邮件列表。 (它应作为GAE cron任务运行)Google ...

php google-app-engine gsuite service-accounts
1个回答
0
投票

因此上面的代码缺少模拟。

© www.soinside.com 2019 - 2024. All rights reserved.