【问题标题】:Google Admin SDK 403 Not Authorized to Access this Resource/APIGoogle Admin SDK 403 未授权访问此资源/API
【发布时间】:2016-12-24 23:41:45
【问题描述】:

我在 java web 应用程序中使用以下代码来尝试获取组的所有用户:

GoogleCredential credential = GoogleCredential.fromStream(Util.class.getResourceAsStream("[credential_file].json")).createScoped(SCOPES);

Directory directory = new Directory.Builder(httpTransport, JSON_FACTORY, credential).build();

Directory.Members dirMem = directory.members();
Members members = dirMem.list("[group_email]").execute();

这会导致最后一行 (dirMem.list...) 出现异常 403(未授权访问此资源/API)。

从文档 (https://developers.google.com/admin-sdk/directory/v1/guides/delegation) 和其他帖子中,我看到解决方案是使用setServiceAccountUser() 设置服务帐户用户。 但是,这意味着我必须使用 p12 文件而不是 json 文件(Google 建议您在创建密钥时使用 json 文件)。

有什么办法可以在使用 json 文件的同时解决这个问题(它还涉及更少的代码)。

谢谢。

【问题讨论】:

  • 您可以使用服务帐户 json 密钥文件而不是 P12 服务帐户 json 密钥文件。记住服务帐号验证码和 Oauth2 验证码是不同的。
  • 谢谢。我确实尝试使用服务帐户密钥文件(按照此处的说明生成:developers.google.com/identity/protocols/…)。它包含字段:类型:“服务帐户”,project_id,private_key_id,private_key,client_email,client_id等。这不是正确的json密钥文件吗?还是我上面的代码中缺少什么?
  • 听起来不错。您将不得不找到一个使用 json 文件而不是 p12 文件的示例。请记住,服务帐户需要获得授权才能访问数据。确保您将其添加为 Google 域上的用户。注意:我不是 Java 程序员,也无权访问 Google 域。对不起,我只能给你提示。

标签: google-api google-api-java-client google-admin-sdk google-oauth


【解决方案1】:

以下是使用 JSON 文件设置管理员电子邮件的解决方案:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.admin.directory.Directory;
import com.google.api.services.admin.directory.DirectoryScopes;
import static com.google.api.client.googleapis.util.Utils.getDefaultJsonFactory;
import static com.google.api.client.googleapis.util.Utils.getDefaultTransport;
// ...

String ADMIN_EMAIL = "admin@company.com";
String jsonConfigFile = "/GSuite Integration.json";
List<String> scopes = Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_USERSCHEMA_READONLY);

GoogleCredential credential;
try (InputStream is = CredentialsWorkaroundTest.class.getResourceAsStream(jsonConfigFile)) {
    credential = GoogleCredential.fromStream(is)
        .createDelegated(ADMIN_EMAIL)
        .createScoped(scopes);
}

Directory service = new Directory.Builder(getDefaultTransport(), getDefaultJsonFactory(), credential)
        .setApplicationName(APPLICATION_NAME)
        .build();

域范围的委派不是必需的)

注意 - 使用 google-api-client 版本 1.28.0

【讨论】:

    【解决方案2】:

    正如this answer to a related question 所建议的那样,包括sub(我认为是主题)以表明您的Google Apps 帐户中委派管理员的电子邮件地址是API 调用正常工作的必要步骤。该委派管理员可能还需要获得授权才能访问/修改您正在调用的数据或端点。由于我的经验是使用 PHP 客户端而不是 Java,因此我不知道您将如何将该电子邮件地址提供给示例中使用的 Java 类的具体细节。

    【讨论】:

      【解决方案3】:

      由于不支持 JSON 凭据 serviceAccountUser 我已经完成了解决方法:制作凭据副本。

      在此处查看代码:https://stackoverflow.com/a/42313446/548473

      【讨论】:

        【解决方案4】:

        目前,我只使用此处概述的 p12 文件:

        https://developers.google.com/admin-sdk/directory/v1/guides/delegation

        如果有人知道使用 json 文件执行此问题中的代码的方法,请随时发表评论/回答。

        【讨论】:

          猜你喜欢
          • 2018-05-16
          • 2019-05-19
          • 2015-11-22
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          • 2014-12-12
          • 2019-04-16
          • 1970-01-01
          相关资源
          最近更新 更多