Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Google云平台服务帐户查询GSuite目录API_Go_Google Cloud Platform_Jwt_Google Workspace - Fatal编程技术网

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

使用Google云平台服务帐户查询GSuite目录API,go,google-cloud-platform,jwt,google-workspace,Go,Google Cloud Platform,Jwt,Google Workspace,我想查询以返回组中的所有用户、Go中的所有用户以及作为GCP服务帐户验证的(脚本将在Google Compute Engine VM或作为Google云函数执行) 我使用的服务帐户(我们称之为我的服务-account@my-project.iam.gserviceaccount.com)已在GSuite中被授予必要的作用域: 我还有一个GSuiteAdmin帐户(我们称之为my)-admin@my-domain.com)。此帐户将用于委托(请参阅) 我可以使用以下代码返回组中的所有用

我想查询以返回组中的所有用户、Go中的所有用户以及作为GCP服务帐户验证的(脚本将在Google Compute Engine VM或作为Google云函数执行)

我使用的服务帐户(我们称之为
我的服务-account@my-project.iam.gserviceaccount.com
)已在GSuite中被授予必要的作用域:

我还有一个GSuiteAdmin帐户(我们称之为
my)-admin@my-domain.com
)。此帐户将用于委托(请参阅)

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

正如您所看到的,代码需要一个
我的服务的JSON密钥文件-account@my-project.iam.gserviceaccount.com
。这是我发现的创建
jwt.Config
对象的唯一方法

此外,请注意,委派是通过行
config.Subject=gsuiteAdminUserEmail
完成的;如果没有这些,我就得到了错误:

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
成功打印
my中的所有用户-group@my-domain.com

但是,因为此代码将通过
我的服务从谷歌计算引擎VM(或谷歌云功能)运行-account@my-project.iam.gserviceaccount.com
用作服务帐户,需要该服务帐户的JSON密钥进行身份验证似乎很荒谬(因为我已经被认证为
我的服务。)-account@my-project.iam.gserviceaccount.com
,在VM上或GCF内)

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

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

googleapi: Error 403: Insufficient Permission: Request had insufficient authentication scopes., insufficientPermissions
由于这与我删除委托时遇到的错误相同,我认为这是相关的。事实上,在创建
管理服务期间,我没有在任何地方提供我的GSuite Admin帐户

任何人都可以帮助解决以下问题之一:

  • 如何直接与在Google Compute Engine VM或Google Cloud函数上运行go脚本的用户进行身份验证
  • 我真的需要JSON密钥文件来生成
    jwt.Config
    对象吗
  • 我已经研究了
    golang.org/x/oauth2/google
    的源代码,我可以得到一个
    oauth2.Config
    ,而不是
    jwt.Config
    ,但是似乎不可能用oauth2令牌“委托”。我还可以如何执行委托
r,err:=srv.Users.List()。
视图类型(“域\公共”)。
客户(“我的客户”)。
订购人(“电子邮件”)。
Do()

试着用这个。

这篇文章有点旧,但希望它能帮助:

我也遇到了同样的问题,通过在计算实例中更改OAuth作用域(默认情况下,作用域仅包括
https://www.googleapis.com/auth/cloud-platform
).在我的情况下,我必须添加
https://www.googleapis.com/auth/admin.directory.group.readonly
scope。可以使用
gcloud compute instances set service account
命令执行此操作。这样,从元数据服务器接收的服务帐户承载令牌具有访问管理目录API的正确作用域

不幸的是,这不能用于云函数,因为云函数OAuth范围似乎不可自定义

有关更多详细信息,请参阅


顺便说一句,现在还可以授予服务帐户访问管理目录API的权限。

您曾经解决过这个问题吗?@anantary很遗憾,没有,我刚刚嵌入了服务帐户密钥的内容(JSON字符串)作为我的云函数的环境变量,我已经使用谷歌KMS加密JSON字符串,以避免在环境变量部分看到未加密的JSON字符串。嘿,欢迎访问堆栈溢出。考虑添加一点更详细的说明为什么你的答案会起作用或者AsKER问题没有在正确的轨道上。
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