1

我正在尝试编写一个目录服务类来与组成员一起使用并且遇到了麻烦。我的服务帐户已获得域范围的委派,并允许https://www.googleapis.com/auth/admin.directory.group.memberhttps://www.googleapis.com/auth/iam范围。我正在模拟具有组管理员角色的用户帐户。

public class DirectoryService {
    private final String APPLICATION_NAME = "GroupsMemberAutomation";
    private final String SERVICE_ACCOUNT_KEY = "groupsmemberautomation-hash.json";
    private static Directory service;

    public DirectoryService() throws IOException {
        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();
        ServiceAccountCredentials serviceAccountCredentials = ServiceAccountCredentials
                .fromStream(DirectoryService.class.getResourceAsStream(SERVICE_ACCOUNT_KEY));
        serviceAccountCredentials = (ServiceAccountCredentials) serviceAccountCredentials
                .createScoped(Arrays.asList("https://www.googleapis.com/auth/iam"));

        ImpersonatedCredentials impersonatedCredentials = ImpersonatedCredentials.create(serviceAccountCredentials,
                "user@my.domain",
                null,
                Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER),
                300);
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(impersonatedCredentials);

        service = new Directory.Builder(httpTransport, jsonFactory, null)
                .setHttpRequestInitializer(requestInitializer)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public void printGroupMembers(String groupKey) throws IOException {
        Members members = service.members().list(groupKey).execute();

        for(Member member : members.getMembers()) {
            System.out.printf("{ email: %s, role: %s, delivery_settings: %s }\n",
                    member.getEmail(),
                    member.getRole(),
                    member.getDeliverySettings());
        }
    }
}

返回的错误是

java.io.IOException: Error requesting access token
    at com.google.auth.oauth2.ImpersonatedCredentials.refreshAccessToken(ImpersonatedCredentials.java:211)
    at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:165)
    at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:151)
    at com.google.auth.http.HttpCredentialsAdapter.initialize(HttpCredentialsAdapter.java:96)
    at com.google.api.client.http.HttpRequestFactory.buildRequest(HttpRequestFactory.java:88)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.buildHttpRequest(AbstractGoogleClientRequest.java:397)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:515)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:448)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:565)
    at sample.DirectoryService.printGroupMembers(DirectoryService.java:49)
    at sample.DirectoryServiceTest.printGroupMembers(DirectoryServiceTest.java:18)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
    at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.google.api.client.http.HttpResponseException: 404 Not Found
{
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "errors": [
      {
        "message": "Requested entity was not found.",
        "domain": "global",
        "reason": "notFound"
      }
    ],
    "status": "NOT_FOUND"
  }
}

    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1094)
    at com.google.auth.oauth2.ImpersonatedCredentials.refreshAccessToken(ImpersonatedCredentials.java:209)
    ... 57 more
4

1 回答 1

0

我认为 .createDelegated 是解决方法。另外,我简化了我的代码。

public class DirectoryService {
    private final String APPLICATION_NAME = "GroupsMemberAutomation";
    private final String SERVICE_ACCOUNT_USER = "user@my.domain";
    private final String SERVICE_ACCOUNT_KEY = "groupsmemberautomation-hash.json";
    private static Directory service;

    public DirectoryService() throws IOException, GeneralSecurityException {
        NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        GoogleCredentials credentials = ServiceAccountCredentials.fromStream(DirectoryService.class.getResourceAsStream(SERVICE_ACCOUNT_KEY))
                .createScoped(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER))
                .createDelegated(SERVICE_ACCOUNT_USER);
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

        service = new Directory.Builder(httpTransport, jsonFactory, requestInitializer)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public void printGroupMembers(String groupKey) throws IOException {
        Members members = service.members().list(groupKey).execute();

        for(Member member : members.getMembers()) {
            System.out.printf("{ email: %s, role: %s, delivery_settings: %s }\n",
                    member.getEmail(),
                    member.getRole(),
                    member.getDeliverySettings());
        }
    }
}
于 2020-01-08T18:57:32.467 回答