使用Google云平台服务帐户查询GSuite目录API
我想查询以返回组中的所有用户、Go中的所有用户以及作为GCP服务帐户验证的(脚本将在Google Compute Engine VM或作为Google云函数执行) 我使用的服务帐户(我们称之为使用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)。此帐户将用于委托(请参阅) 我可以使用以下代码返回组中的所有用
我的服务-account@my-project.iam.gserviceaccount.com
)已在GSuite中被授予必要的作用域:
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