gpt4 book ai didi

java - 向 Google Admin Directory API 进行身份验证

转载 作者:行者123 更新时间:2023-11-29 04:13:21 32 4
gpt4 key购买 nike

(我已经在 SO 上查看了类似的问题,但是没有一个建议对我有用)

我有一个在 Google App Engine(在 Google Cloud Platform 上)上运行的 API 服务。我需要向 Google Admin Directory API 进行身份验证,以便我可以在我们的 GSuite 域上创建群组。

我最初按照 Obtaining and providing service account credentials manually 的指南尝试隐式授权,但我认为这可能仅限于在 Google App Engine 上运行的应用程序之间的通信。我的理解是,在 App Engine 之外与 Google API 对话需要 OAuth 2.0,因此我进行了如下设置:

我已经设置了 App Engine 默认服务帐户,并且已经从 Google Cloud Platform 中向该帐户授予域范围的授权。我还按照本指南 - https://developers.google.com/admin-sdk/reports/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account 从 GSuite 方面委派了域范围的权限。

我已经为服务帐户生成了一个 P12 key 。然后我设置凭据并使用它们来实例化 Google Admin Directory 客户端 API,如下所示:

final List<String> SCOPES = Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_GROUP);

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

/** Email of the Service Account */
final String SERVICE_ACCOUNT_EMAIL = "my_service_account_email@appspot.gserviceaccount.com";
final String USER_EMAIL = "myGsuiteAdmin@mydomain.com";

/** Path to the Service Account's Private Key file */
final String SERVICE_ACCOUNT_PKCS12_FILE = "myPath.p12";

String p12Password = "notasecret";

ClassLoader classLoader = this.getClass().getClassLoader();

KeyStore keystore = KeyStore.getInstance("PKCS12");
InputStream keyFileStream = classLoader.getResourceAsStream(SERVICE_ACCOUNT_PKCS12_FILE);

if (keyFileStream == null){
throw new Exception("Key File Not Found.");
}

keystore.load(keyFileStream, p12Password.toCharArray());
PrivateKey pk = (PrivateKey)keystore.getKey("privatekey", p12Password.toCharArray());

GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(SCOPES)
.setServiceAccountUser(USER_EMAIL)
.setServiceAccountPrivateKey(pk)
.build();


Directory directory = new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
.setHttpRequestInitializer(credential).build();

com.google.api.services.admin.directory.model.Group group = new Group();
group.setEmail("test@mydomain.com");
group.setName("test_group");
group.setDescription("test_group_desc");

Group googleGroup = directory.groups().insert(group).execute();

// error on the line above (403: Not Authorized to access this resource/api - forbidden)

我在最后一行尝试创建一个新组时遇到错误:

Group googleGroup = directory.groups().insert(group).execute();
403: Not Authorized to access this resource/api - forbidden

我需要做什么才能成功进行身份验证?

最佳答案

您的解决方案是遵循文档。

  1. 不要使用 App Engine 服务帐户。创建一个新的服务帐户。
  2. 不要使用 P12 (PFX),因为它们已被弃用。大多数 API 不再支持它们。使用 JSON 凭证文件。
  3. 您需要将全域权限委托(delegate)给服务帐户。
  4. 使用服务帐户凭据,您可以冒充另一个拥有域 super 管理员权限并且至少登录 G Suite 一次并接受条款和条件的用户。

Perform G Suite Domain-Wide Delegation of Authority

关于java - 向 Google Admin Directory API 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808710/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com