当前位置: 首页 > 知识库问答 >
问题:

使用Google云平台服务帐户查询GSuite目录API

茹航
2023-03-14

我想查询GSuite Admin SDK Directory API,以返回Go中组中的所有用户,并作为GCP服务帐户进行身份验证(该脚本将在Google Compute Engine VM中执行或作为Google Cloud函数执行)。

我使用的服务帐户(我们称之为 )在GSuite中被授予了必要的作用域:

我还有一个GSuite管理帐户(我们称之为

我能够用以下代码返回一个组中的所有用户(基于上面提供的链接中的代码,并且我删除了大部分错误处理以使代码更短):

package main

import (
    "io/ioutil"
    "log"
    "os"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    admin "google.golang.org/api/admin/directory/v1"
)

func main() {
    srv := createAdminDirectoryService(
        os.Getenv("SERVICE_ACCOUNT_FILE_PATH"),
        os.Getenv("GSUITE_ADMIN_USER_EMAIL"),
    )
    members := listUsersInGroup(srv, os.Args[1])
    log.Println(members)
}

func createAdminDirectoryService(serviceAccountFilePath,
                                 gsuiteAdminUserEmail string) *admin.Service {
    jsonCredentials, _ := ioutil.ReadFile(serviceAccountFilePath)

    config, _ := google.JWTConfigFromJSON(
        jsonCredentials,
        admin.AdminDirectoryGroupMemberReadonlyScope,
    )
    config.Subject = gsuiteAdminUserEmail

    ctx := context.Background()
    client := config.Client(ctx)

    srv, _ := admin.New(client)
    return srv
}

func listUsersInGroup(srv *admin.Service, groupEmail string) []string {
    members, err := srv.Members.List(groupEmail).Do()
    if err != nil {
        log.Fatal(err)
    }

    membersEmails := make([]string, len(members.Members))
    for i, member := range members.Members {
        membersEmails[i] = member.Email
    }

    return membersEmails
}

如您所见,该代码要求有一个JSON密钥文件 。这是我找到的创建 对象的唯一方法。

此外,请注意,委托是用

googleapi: Error 403: Insufficient Permission: Request had insufficient authentication scopes., insufficientPermissions

不管怎样,跑步:

SERVICE_ACCOUNT_FILE_PATH=/path/to/json/key/of/my/service/account \
GSUITE_ADMIN_USER_EMAIL=my-admin@my-domain.com \
go run main.go my-group@my-domain.com

成功打印 中的所有用户。

但是,由于该代码将从使用 作为服务帐户的Google Compute Engine VM(或Google Cloud函数)运行,因此需要该服务帐户的JSON密钥来进行身份验证似乎是荒谬的(因为我已经在VM或GCF内部通过了 身份验证)。

我已尝试用以下代码替换 的内容,以便作为启动脚本的用户进行身份验证(使用默认凭据):

func createAdminDirectoryService() *admin.Service {
    ctx := context.Background()

    client, _ := google.DefaultClient(ctx, scopes...)

    srv, _ := admin.New(client)
    return srv
}

但列出用户将返回一个错误:

googleapi: Error 403: Insufficient Permission: Request had insufficient authentication scopes., insufficientPermissions

由于这是我在删除委托时得到的相同错误,我认为这是相关的。实际上,在 创建期间,我没有在任何地方提供我的GSuite管理帐户。

有没有人能就以下几点提供帮助:

    object?/li> 的源代码,我可以得到 而不是 ,但是似乎不可能用oauth2令牌“委托”。我还可以如何执行委托?/li>

共有1个答案

梁渊
2023-03-14
golang prettyprint-override">    r, err := srv.Users.List().
        ViewType("domain_public").
        Customer("my_customer").
        OrderBy("email").
        Do()

试试用这个。

 类似资料:
  • 问题内容: 上述代码的结果是: 开启。服务帐户客户ID已在GSuite中使用适当的范围进行了授权。 该服务帐户可用于普通凭据。它仅不适用于委托凭证。 我在我们的域中尝试了不同的API(作用域)和不同的用户。 我有一个同事尝试从头开始编写示例,他得到了同样的东西。 问题答案: 我认为您的问题是,在调用Calendar API 之前,您没有对凭据进行授权,但是我在自己的实现中使用了一些区别 使用以下导

  • 我已经创建了一个Google云平台服务帐户,,具有存储管理员()角色。 现在,我希望限制此帐户,使其只能访问特定的谷歌云存储(GCS)存储桶()。 现在的问题是,可以访问所有GCS存储桶。我无法从其他GCS存储桶中删除,因为被继承。 那我该怎么办?

  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

  • 根据留档 GSuite Marketplace应用程序OAuth Web服务器应用程序离线访问 网络服务器应用程序可以由域的管理员通过 OAuth 授予域访问权限。对于其他域用户模拟,可以使用服务帐户。 在我的设置中,我有 > 启用了管理员 Gmail 市场 SDK 市场 API 的 Web 服务器应用。 Web服务器应用程序凭据可用。 提供具有域范围授权和凭据的服务帐户。 对于步骤 获取 Web

  • 我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没

  • 问题内容: 我正在尝试使用服务帐户在Google日历上创建条目。我真的很接近,但是最后一行是行不通的。我让它运行时得到提示。否则,程序将毫无错误地运行,无论花费多少。 该文件的内容可以发现在这里。在我试图调用方法开始在该文件上的1455线。 问题答案: 我想通了。由于我看不到将服务帐户与API v3一起使用的完整示例,因此我将发布完整的解决方案以供参考。但是,除了实现代码外,还需要做一些事情: 1