目标是在G-Suite平台中建立一个服务帐户,应用程序可以使用该帐户执行操作,而无需提示用户进行身份验证。
我们遇到的问题与下面的帖子非常相似,但略有不同。
只要我们遵循“模拟”流程,事情就会正常进行。使用模拟,授权规则遵循被模拟的用户。理想情况下,我们希望相应地作用于服务帐户,而不是模拟用户。当我们这样做时,我们经常收到403。
我们已经尽力按照这里的指示去做了:
我们的Java片段与此类似:
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
File file = new File(MdmResource.class.getClassLoader().getResource("myproject.p12").getFile());
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("105601508644514129999")
.setServiceAccountPrivateKeyFromP12File(file)
.setServiceAccountScopes(
Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY))
.setServiceAccountUser("user@domain.com") // 403 when this is commented out
.build();
Directory dir = new Directory(HTTP_TRANSPORT, JSON_FACTORY, credential);
Get result = dir.users().get("dude@domain.com");
User user = result.execute();
System.out.println(user.get("customerId"));
在GCP中,我们在作为超级管理员登录时创建了ServiceAccount。我们启用了域范围的委托并生成了密钥(在本例中,p12类型并使用相应的文件作为Java应用程序的输入)。
然后,在API库中,我们启用了Admin SDK。
在Google Admin中,在Security/Advanced settings下,我们设置作用域。我们使用了105601508644514129999和https://www.googleapis.com/auth/admin.directory.device.mobile.https://www.googleapis.com/auth/admin.directory.user.readonly.https://www.googleapis.com/auth/admin.directory.user
当我们运行Java代码时,当“SetServiceAccountUser”被注释掉(只要用户具有正确的权限,在模拟时可以正常工作)时,我们会看到以下情况:
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Not Authorized to access this resource/api",
"reason" : "forbidden"
} ],
"message" : "Not Authorized to access this resource/api"
}
所以,看起来我们的SA没有正确地连接到作用域,但是我不知道怎么做。
另外,105601508644514129999是SA唯一ID和OAuth 2.0凭据的客户端ID,这些凭据是在SA创建过程中自动生成的。我们还为“setServiceAccountID”使用了SA电子邮件,如下面的示例所示,但仍然得到403。https://developers.google.com/admin-sdk/directory/v1/guides/development。实际上,我认为这个例子还有另一个问题。SetServiceAccountScopes。
最后。。。
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>0.20.0</version>
</dependency>
<!-- Used to navigate Google Directory services, like https://developers.google.com/admin-sdk/directory -->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-admin-directory</artifactId>
<version>directory_v1-rev117-1.25.0</version>
</dependency>
有什么想法吗?
服务帐户不在G Suite域中(即使它们由其中的用户/项目拥有),因此不能被授予对G Suite域的管理访问权限。他们所能做的就是用域范围的委托来模拟域中的用户。
您可能需要考虑的是,使用客户机ID和机密授予作为管理员用户的常规OAuth,并确保获得长期有效的刷新令牌
问题内容: 上述代码的结果是: 开启。服务帐户客户ID已在GSuite中使用适当的范围进行了授权。 该服务帐户可用于普通凭据。它仅不适用于委托凭证。 我在我们的域中尝试了不同的API(作用域)和不同的用户。 我有一个同事尝试从头开始编写示例,他得到了同样的东西。 问题答案: 我认为您的问题是,在调用Calendar API 之前,您没有对凭据进行授权,但是我在自己的实现中使用了一些区别 使用以下导
我正在构建一个需要读取普通Gmail收件箱(不是域的一部分)的Web服务。 代码: 错误: 我看不出这有什么原因不起作用,但读完这篇文章后,你似乎不能在个人@gmail帐户上使用服务帐户凭据。有谁知道这是真的还是我做错了什么? 感谢您的帮助! 更新 如果我将更改为,我可以查看邮件,但无法修改标签,这是我的要求。
我提出了一个GSuite市场列表,创建了服务帐户并启用了域范围的委托。我想检索客户的用户和组织单位。 null null 我是不是错过了什么在市场上的清单?
我想使用Google服务帐户JWT令牌获取Azure服务主体(SP)的临时凭据。这是从GKE工作负载调用Azure API所必需的,而无需在GKE中存储长期SP凭据。 这样的联盟对GCP来说可能吗- [1]https://cloud.google.com/iam/docs/workload-identity-federation [2] https://docs.aws.amazon.com/IA
我试图实现与谷歌服务号的用户模拟,一直有一段时间的问题,这是我在Java使用的代码: 当我尝试从共享日历中读取事件时,我收到以下身份验证错误: com.google.api.client.auth.oauth2.TokenResponseException: 401未经授权的邮政https://oauth2.googleapis.com/token 如果我不使用模拟,我可以读取事件,但不能邀请与会
我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没