Google Admin SDK 403 无权访问此 Resource/API

Google Admin SDK 403 Not Authorized to Access this Resource/API

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

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(未授权访问此 resource/API)。

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

有什么方法可以解决这个问题,同时仍然使用 json 文件(它也涉及更少的代码)。

谢谢。

现在,我只使用此处概述的 p12 文件:

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

如果有人知道使用 json 文件执行此问题中的代码的方法,请随时 comment/answer。

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

查看代码:

根据 的建议,在您的 Google Apps 帐户中包含 sub(我认为是主题)以指示委派管理员的电子邮件地址是必要的步骤API 工作电话。该委派管理员可能还需要获得 access/modify 您正在调用的数据或端点的授权。由于我的经验是使用 PHP 客户端,而不是 Java,我不知道您将如何将该电子邮件地址提供给正在使用的 Java 类在你的例子中。

这是通过 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();

Domain-wide 授权 不需要)

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