【问题标题】:How can I access group members with a service account?如何使用服务帐户访问组成员?
【发布时间】:2015-08-26 03:33:12
【问题描述】:

我正在尝试使用服务帐户访问群组成员。我已验证我可以代表用户使用普通 OAuth2 令牌执行此操作,并调用 https://www.googleapis.com/admin/directory/v1/groups/{group}/members 和范围 https://www.googleapis.com/auth/admin.directory.group.readonly

我想对服务帐户执行相同的操作,并且我已将服务帐户电子邮件地址添加为群组成员,并确认 查看成员 权限设置为“所有成员组,所有组织成员”。

当我询问成员列表时,我收到此错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "forbidden",
    "message": "Not Authorized to access this resource/api"
   }
  ],
  "code": 403,
  "message": "Not Authorized to access this resource/api"
 }
}

我需要做什么才能授权此服务帐户查看群组?

【问题讨论】:

  • 在帖子开头或结尾重新表述您的问题是一个很好的做法。确保您在问题的帖子中有问题;)
  • 服务帐户可能是一个令人困惑的术语。您是指您在 API 控制台中创建的服务帐户吗?或者它只是一个通用的用户帐户?
  • 是的,我的意思是在 API 控制台中创建的服务帐户。
  • 您是否已根据此处的文档授权服务帐户的范围:developers.google.com/admin-sdk/directory/v1/guides/delegation?服务帐户不需要任何会员资格,因为您授予对可以查看会员详细信息的 Admin SDK 的访问权限(就像任何超级管理员帐户访问权限一样)。
  • 我现在有,但请看下面:它没有任何区别。

标签: service-accounts google-groups google-admin-sdk


【解决方案1】:

假设你有以下情况

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ["https://www.googleapis.com/auth/admin.directory.user", 
          "https://www.googleapis.com/auth/admin.directory.group"]

credentials = service_account.Credentials.from_service_account_file(
                PATH-TO-YOUR-SERVICE-ACCOUNT-FILE, 
                scopes=SCOPES, subject=ADMIN-EMAIL-ID)
service = build('admin', 'directory_v1', credentials=credentials)
group = "YOUR-GROUP-EMAIL-ID"
direct_members = service.members().list(groupKey=group).execute()["members"]
print(direct_members)

# Note that the above code would give only direct members.
# To get the direct members, set the `inclueDerivedMembership` 
# argument to True as below.
all_members = service.members().list(
              groupKey=group, inclueDerivedMembership=True).execute()["members"]
print(all_members)

这个答案的真实来源是here

【讨论】:

    【解决方案2】:

    您可以按照以下 API 文档页面中概述的步骤创建服务帐户并执行域范围内的授权,请记住您需要任何属于该组成员的用户的电子邮件地址(userEmail 在下面的代码 sn-p 中),以便服务帐户可以代表他们行事:

    https://developers.google.com/admin-sdk/directory/v1/guides/delegation

    该页面包含一个 Java 和 Python 示例,说明如何使用在 Google Developers Console 上创建的服务帐户和私钥来实例化 com.google.api.services.admin.directory.Directory 对象

     GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
      .setServiceAccountScopes(DirectoryScopes.ADMIN_DIRECTORY_USERS)
      .setServiceAccountUser(userEmail)
      .setServiceAccountPrivateKeyFromP12File(
          new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
      .build();
    

    【讨论】:

    • 看起来很有希望。我已经在“管理 API 客户端访问”下添加了我的服务帐户客户端 ID,现在我想我被困在下一步了。这是一个使用密钥内容的简短代码示例;第一次调用 G+ API 有效,所以我知道密钥是好的,第二次继续失败:gist.github.com/migurski/9b8e44da1536c5713e0a
    • 什么是client_email?这是服务帐户电子邮件还是服务帐户代表其行事的用户的电子邮件
    • 服务帐号邮箱,貌似nnnnnnn-nnnnnnn@developer.gserviceaccount.com
    • 使用服务帐户时,您代表某人行事,因此您需要以某种方式进行设置
    • 嗯,好的。在我正在使用的 API 中,我没有看到任何地方可以做到这一点。由于我试图使用服务帐户来规避像使用 OAuth 那样代表某人工作的需要,所以无论如何这可能是完全错误的路径。感谢您的帮助!
    猜你喜欢
    • 2020-05-13
    • 2021-10-09
    • 2020-04-13
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多