【问题标题】:members list giving "Requested entity was not found"给出“未找到请求的实体”的成员列表
【发布时间】:2020-04-21 14:03:39
【问题描述】:

我正在尝试编写一个目录服务类来与网上论坛成员一起工作,但遇到了麻烦。我的服务帐户已被授予域范围的委派,并允许 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

【问题讨论】:

    标签: google-api google-directory-api google-auth-library


    【解决方案1】:

    我认为 .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());
            }
        }
    }
    

    【讨论】:

    • 这里有相同的体验,但是我们是否必须提供有效的域用户才能执行具有域范围委派的 api 调用?这看起来不对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-01-15
    • 2016-11-06
    • 2020-02-19
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多