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

带有服务帐户的Google Admin SDK(无模拟)

燕航
2023-03-14

目标是在G-Suite平台中建立一个服务帐户,应用程序可以使用该帐户执行操作,而无需提示用户进行身份验证。

我们遇到的问题与下面的帖子非常相似,但略有不同。

只要我们遵循“模拟”流程,事情就会正常进行。使用模拟,授权规则遵循被模拟的用户。理想情况下,我们希望相应地作用于服务帐户,而不是模拟用户。当我们这样做时,我们经常收到403。

我们已经尽力按照这里的指示去做了:

    https:>

我们的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>

有什么想法吗?

共有1个答案

章玮
2023-03-14

服务帐户不在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: 这有什么意义?我有没