0

Using the below for building a client application to fetch data from Microsoft Graph.
Microsoft Graph : 3.2.0
Authentication Provider : ClientSecretCredential

Code Snippet:

Proxy proxyTest = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(GraphMain.PROXY_HOST, GraphMain.PROXY_PORT));
        Authenticator proxyAuth = new Authenticator() {
            @Override
            public Request authenticate(final Route route, final Response response) throws IOException {
                String credential = Credentials.basic(GraphMain.PROXY_USER, GraphMain.PROXY_PASSWORD);
                return response.request().newBuilder().header("Proxy-Authorization", credential).build();
            }
        };

        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(GraphMain.CLIENT_ID).clientSecret(GraphMain.CLIENT_SECRET).tenantId(GraphMain.TENANT_GUID)
                .build();
        final TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(
                Arrays.asList(GraphMain.SCOPES), clientSecretCredential);

        final OkHttpClient httpClient = HttpClients.createDefault(tokenCredAuthProvider).newBuilder().proxy(proxyTest)
                .proxyAuthenticator(proxyAuth).build();

        final GraphServiceClient<Request> graphClient = GraphServiceClient.builder().httpClient(httpClient)
                .buildClient();

        // We can expand only one child
        UserCollectionPage userCollectionPage = graphClient.users().buildRequest()
                .select("Id,DisplayName,Mail,UserPrincipalName,EmployeeId").expand("registeredDevices").get();

References used to build above code snippet :

  1. Create a Micrsoft Graph Client
  2. Customize the Microsoft Graph SDK service client

Error :

    ... 21 more
[ForkJoinPool.commonPool-worker-1] ERROR com.microsoft.aad.msal4j.ConfidentialClientApplication - [Correlation ID: 3f7476a4-ab9e-40fd-b501-3b7474eb66a0] Execution of class com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier failed.
com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequest(HttpHelper.java:68)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.sendInstanceDiscoveryRequest(AadInstanceDiscoveryProvider.java:119)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.doInstanceDiscoveryAndCache(AadInstanceDiscoveryProvider.java:135)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.getMetadataEntry(AadInstanceDiscoveryProvider.java:42)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.getAuthorityWithPrefNetworkHost(AuthenticationResultSupplier.java:32)
    at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.execute(AcquireTokenByAuthorizationGrantSupplier.java:59)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:59)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at com.azure.core.http.policy.RetryPolicy.lambda$attemptAsync$1(RetryPolicy.java:127)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:88)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:165)
    at reactor.core.publisher.MonoSingle$SingleSubscriber.onError(MonoSingle.java:141)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onError(MonoFlatMapMany.java:197)
    at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.whenError(FluxRetryWhen.java:213)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenOtherSubscriber.onError(FluxRetryWhen.java:255)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:406)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:243)
    at reactor.core.publisher.DirectProcessor$DirectInner.onNext(DirectProcessor.java:339)
    at reactor.core.publisher.DirectProcessor.onNext(DirectProcessor.java:148)
    at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:180)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$TcpClientSubscriber.onError(HttpClientConnect.java:353)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onError(PooledConnectionProvider.java:521)
    at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:427)
    at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.lambda$drainLoop$5(SimpleDequePool.java:310)
    at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:172)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:302)
    at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:252)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
    at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)
    at io.netty.util.concurrent.DefaultPromise.setFailure(DefaultPromise.java:109)
    at io.netty.channel.DefaultChannelPromise.setFailure(DefaultChannelPromise.java:89)
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:214)
    at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:180)
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:166)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
    at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605)
    at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
    at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1000)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:504)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:417)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:474)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)
    Suppressed: java.lang.Exception: #block terminated with an error
        at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
        at reactor.core.publisher.Mono.block(Mono.java:1685)
        at com.azure.identity.implementation.HttpPipelineAdapter.send(HttpPipelineAdapter.java:58)
        at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequestWithRetries(HttpHelper.java:86)
        at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequest(HttpHelper.java:64)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.sendInstanceDiscoveryRequest(AadInstanceDiscoveryProvider.java:119)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.doInstanceDiscoveryAndCache(AadInstanceDiscoveryProvider.java:135)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.getMetadataEntry(AadInstanceDiscoveryProvider.java:42)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.getAuthorityWithPrefNetworkHost(AuthenticationResultSupplier.java:32)
        at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.execute(AcquireTokenByAuthorizationGrantSupplier.java:59)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:59)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
        at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.net.UnknownHostException: login.microsoftonline.com
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
    at java.net.InetAddress.getAllByName(InetAddress.java:1192)
    at java.net.InetAddress.getAllByName(InetAddress.java:1126)
    at java.net.InetAddress.getByName(InetAddress.java:1076)
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:156)
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at io.netty.util.internal.SocketUtils.addressByName(SocketUtils.java:153)
    at io.netty.resolver.DefaultNameResolver.doResolve(DefaultNameResolver.java:41)
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:61)
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:53)
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:55)
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:31)
    at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:106)
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:206)
    ... 21 more
[ForkJoinPool.commonPool-worker-1] ERROR com.azure.identity.ClientSecretCredential - Azure Identity => ERROR in getToken() call for scopes [https://graph.microsoft.com/.default]: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
Exception in thread "main" com.microsoft.graph.core.ClientException: Error executing the request
    at com.microsoft.graph.http.CoreHttpProvider.sendRequestInternal(CoreHttpProvider.java:388)
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:214)
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:191)
    at com.microsoft.graph.http.BaseCollectionRequest.send(BaseCollectionRequest.java:102)
    at com.microsoft.graph.http.BaseEntityCollectionRequest.get(BaseEntityCollectionRequest.java:78)
    at com.gme.test.GraphMain.main(GraphMain.java:56)
Caused by: java.io.IOException: java.util.concurrent.ExecutionException: com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at com.microsoft.graph.httpcore.AuthenticationHandler.intercept(AuthenticationHandler.java:65)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
    at com.microsoft.graph.httpcore.TelemetryHandler.intercept(TelemetryHandler.java:69)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
    at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
    at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
    at com.microsoft.graph.http.CoreHttpProvider.sendRequestInternal(CoreHttpProvider.java:385)
    ... 5 more
Caused by: java.util.concurrent.ExecutionException: com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
    at com.microsoft.graph.httpcore.AuthenticationHandler.intercept(AuthenticationHandler.java:55)
    ... 11 more
Caused by: com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequest(HttpHelper.java:68)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.sendInstanceDiscoveryRequest(AadInstanceDiscoveryProvider.java:119)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.doInstanceDiscoveryAndCache(AadInstanceDiscoveryProvider.java:135)
    at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.getMetadataEntry(AadInstanceDiscoveryProvider.java:42)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.getAuthorityWithPrefNetworkHost(AuthenticationResultSupplier.java:32)
    at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.execute(AcquireTokenByAuthorizationGrantSupplier.java:59)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:59)
    at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: login.microsoftonline.com
    at com.azure.core.http.policy.RetryPolicy.lambda$attemptAsync$1(RetryPolicy.java:127)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:88)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:165)
    at reactor.core.publisher.MonoSingle$SingleSubscriber.onError(MonoSingle.java:141)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onError(MonoFlatMapMany.java:197)
    at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.whenError(FluxRetryWhen.java:213)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenOtherSubscriber.onError(FluxRetryWhen.java:255)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:406)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:243)
    at reactor.core.publisher.DirectProcessor$DirectInner.onNext(DirectProcessor.java:339)
    at reactor.core.publisher.DirectProcessor.onNext(DirectProcessor.java:148)
    at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
    at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:180)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$TcpClientSubscriber.onError(HttpClientConnect.java:353)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onError(PooledConnectionProvider.java:521)
    at reactor.netty.internal.shaded.reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:427)
    at reactor.netty.internal.shaded.reactor.pool.SimpleDequePool.lambda$drainLoop$5(SimpleDequePool.java:310)
    at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:172)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:185)
    at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:302)
    at reactor.netty.resources.PooledConnectionProvider$PooledConnectionAllocator$PooledConnectionInitializer.operationComplete(PooledConnectionProvider.java:252)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
    at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)
    at io.netty.util.concurrent.DefaultPromise.setFailure(DefaultPromise.java:109)
    at io.netty.channel.DefaultChannelPromise.setFailure(DefaultChannelPromise.java:89)
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:214)
    at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:180)
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:166)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
    at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605)
    at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
    at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1000)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:504)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:417)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:474)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)
    Suppressed: java.lang.Exception: #block terminated with an error
        at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
        at reactor.core.publisher.Mono.block(Mono.java:1685)
        at com.azure.identity.implementation.HttpPipelineAdapter.send(HttpPipelineAdapter.java:58)
        at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequestWithRetries(HttpHelper.java:86)
        at com.microsoft.aad.msal4j.HttpHelper.executeHttpRequest(HttpHelper.java:64)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.sendInstanceDiscoveryRequest(AadInstanceDiscoveryProvider.java:119)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.doInstanceDiscoveryAndCache(AadInstanceDiscoveryProvider.java:135)
        at com.microsoft.aad.msal4j.AadInstanceDiscoveryProvider.getMetadataEntry(AadInstanceDiscoveryProvider.java:42)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.getAuthorityWithPrefNetworkHost(AuthenticationResultSupplier.java:32)
        at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.execute(AcquireTokenByAuthorizationGrantSupplier.java:59)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:59)
        at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
        at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.net.UnknownHostException: login.microsoftonline.com
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
    at java.net.InetAddress.getAllByName(InetAddress.java:1192)
    at java.net.InetAddress.getAllByName(InetAddress.java:1126)
    at java.net.InetAddress.getByName(InetAddress.java:1076)
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:156)
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at io.netty.util.internal.SocketUtils.addressByName(SocketUtils.java:153)
    at io.netty.resolver.DefaultNameResolver.doResolve(DefaultNameResolver.java:41)
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:61)
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:53)
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:55)
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:31)
    at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:106)
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:206)
    ... 21 more

Update 1: Code updated as per @baywet's commment
Note : Still getting the same error.

Proxy proxyTest = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(GraphMain.PROXY_HOST, GraphMain.PROXY_PORT));
        Authenticator proxyAuth = new Authenticator() {
            @Override
            public Request authenticate(final Route route, final Response response) throws IOException {
                String credential = Credentials.basic(GraphMain.PROXY_USER, GraphMain.PROXY_PASSWORD);
                return response.request().newBuilder().header("Proxy-Authorization", credential).build();
            }
        };

        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(GraphMain.CLIENT_ID).clientSecret(GraphMain.CLIENT_SECRET).tenantId(GraphMain.TENANT_GUID)
                .build();
        final TokenRequestContext context = new TokenRequestContext();
        context.setScopes(Arrays.asList(GraphMain.SCOPES));
        try {
            clientSecretCredential.getToken(context).toFuture().get();
        } catch (InterruptedException | ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Update 2:
Code updated as per baywets suggestion to set proxy for both azure identity as well as graph client.

// these are the proxy options for azure identity
        ProxyOptions pOptions = new ProxyOptions(ProxyOptions.Type.HTTP,
                new InetSocketAddress(GraphMain.PROXY_HOST, GraphMain.PROXY_PORT));
        pOptions.setCredentials(GraphMain.PROXY_USER, GraphMain.PROXY_PASSWORD);
        // set the proxy options here
        final HttpClientOptions clientOptions = new HttpClientOptions();
        clientOptions.setProxyOptions(pOptions);
        final HttpClient httpClient = HttpClient.createDefault(clientOptions);
        // these are the proxy options for the graph client
        Proxy proxyTest = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(GraphMain.PROXY_HOST, GraphMain.PROXY_PORT));
        Authenticator proxyAuth = new Authenticator() {
            @Override
            public Request authenticate(final Route route, final Response response) throws IOException {
                String credential = Credentials.basic(GraphMain.PROXY_USER, GraphMain.PROXY_PASSWORD);
                return response.request().newBuilder().header("Proxy-Authorization", credential).build();
            }
        };

        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(GraphMain.CLIENT_ID).clientSecret(GraphMain.CLIENT_SECRET).tenantId(GraphMain.TENANT_GUID)
                .httpClient(httpClient) // don't forget that addition to use the configured client
                .build();
        final TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(
                Arrays.asList(GraphMain.SCOPES), clientSecretCredential);

        final OkHttpClient okHttpClient = HttpClients.createDefault(tokenCredAuthProvider).newBuilder().proxy(proxyTest)
                .proxyAuthenticator(proxyAuth).build();

        final GraphServiceClient<Request> graphClient = GraphServiceClient.builder().httpClient(okHttpClient)
                .buildClient();

        // We can expand only one child
        UserCollectionPage userCollectionPage = graphClient.users().buildRequest()          .select("Id,DisplayName,Mail,UserPrincipalName,EmployeeId").expand("registeredDevices").get();

Can someone help how the proxy needs to be set?

Sujit J
  • 55
  • 2
  • 12
  • to rule out this is coming from the Microsoft Graph SDK, let's remove it from the code snippet and see if we still get the same error message. Can you remove line `final TokenCredentialAuthProvider tokenCredAuthProvider` and everything below, and replace it by ``` final TokenRequestContext context = new TokenRequestContext(); context.setScopes(Arrays.asList(GraphMain.SCOPES)); clientSecretCredential.getToken(context).toFuture().get(); ``` – baywet Apr 19 '21 at 12:54
  • @baywet have replaced everything . This is the new ```final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder().clientId(GraphMain.CLIENT_ID).clientSecret(GraphMain.CLIENT_SECRET).tenantId(GraphMain.TENANT_GUID).build(); final TokenRequestContext context = new TokenRequestContext(); context.setScopes(Arrays.asList(GraphMain.SCOPES)); try { clientSecretCredential.getToken(context).toFuture().get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }```. Still same error.. – Sujit J Apr 19 '21 at 14:50
  • can you update the question for readability please? – baywet Apr 20 '21 at 13:22
  • @baywet updated – Sujit J Apr 21 '21 at 04:14
  • @baywet I have tested with ms graph 3.3.0, however the results are the same. – Sujit J Apr 22 '21 at 08:20
  • @baywet, can you check and advice. Im still getting SocketException as mentioned in https://stackoverflow.com/questions/66820194/microsoft-graph-3-0-java-net-sockettimeoutexception-while-retrieving-group-membe – Sujit J Apr 23 '21 at 11:41

1 Answers1

2

You are experiencing this error because the proxy for Azure Identity (the library that gets the token for the Graph SDK) doesn't have its proxy set.

Here is a snippet to help you get started:

// these are the proxy options for azure identity
final ProxyOptions pOptions = new ProxyOptions();
// set the proxy options here
final HttpClientOptions clientOptions = new HttpClientOptions();
clientOptions.setProxyOptions(pOptions);    
final HttpClient httpClient = HttpClient.createDefault(clientOptions);
// these are the proxy options for the graph client
Proxy proxyTest = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(GraphMain.PROXY_HOST, GraphMain.PROXY_PORT));
Authenticator proxyAuth = new Authenticator() {
    @Override
    public Request authenticate(final Route route, final Response response) throws IOException {
           String credential = Credentials.basic(GraphMain.PROXY_USER, GraphMain.PROXY_PASSWORD);
           return response.request().newBuilder().header("Proxy-Authorization", credential).build();
        }
};

final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder() .clientId(GraphMain.CLIENT_ID).clientSecret(GraphMain.CLIENT_SECRET).tenantId(GraphMain.TENANT_GUID)
.httpClient(httpClient) // don't forget that addition to use the configured client
.build();
final TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(
Arrays.asList(GraphMain.SCOPES), clientSecretCredential);

final OkHttpClient httpClient = HttpClients.createDefault(tokenCredAuthProvider).newBuilder().proxy(proxyTest)
.proxyAuthenticator(proxyAuth).build();

final GraphServiceClient<Request> graphClient = GraphServiceClient.builder().httpClient(httpClient)
.buildClient();

// We can expand only one child
 UserCollectionPage userCollectionPage = graphClient.users().buildRequest()
                .select("Id,DisplayName,Mail,UserPrincipalName,EmployeeId").expand("registeredDevices").get();

You can find more information about the proxy options for azure identity here

baywet
  • 4,377
  • 4
  • 20
  • 49
  • Thanks for the code snippet. I have tried the above with microsoft-graph 3.2.0 and im able to fetch the records without proxy error but there is a proxy warning. ```[reactor-http-nio-1] WARN reactor.netty.http.client.HttpClientConnect - [id: 0xda88f955, L:/xxx.xxx.xxx.xxx:58811 - R:ab.cd.ef/xxx.xxx.xxx.xxx:8080] The connection observed an error io.netty.handler.proxy.ProxyConnectException: Failed to connect to proxy. at com.azure.core.http.netty.implementation.HttpProxyHandler.handleResponse(HttpProxyHandler.java:239)```. Is the warning a known? – Sujit J Apr 26 '21 at 09:47
  • I'm not sure, I suggest you report this issue here. Also, don't forget to mark as answer. https://github.com/Azure/azure-sdk-for-java – baywet Apr 26 '21 at 11:04
  • Thanks @baywet. On a side note, have tried the above code snippet with microsoft-graph 3.3.0, but that doesn't seem to work. Getting ```com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: Search domain query failed. Original hostname: 'login.microsoftonline.com' failed to resolve 'login.microsoftonline.com.workstations.xxxx' after 4 queries``` – Sujit J Apr 26 '21 at 13:25
  • i have tried using ***microsoft-graph 3.7.0***, but still facing the same issue : `com.microsoft.aad.msal4j.MsalClientException: java.lang.RuntimeException: Max retries 3 times exceeded. Error Details: Search domain query failed. Original hostname: 'login.microsoftonline.com' failed to resolve 'login.microsoftonline.com.workstations.xxxx' after 4 queries` `Caused by: io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Search domain query failed. Original hostname: 'login.microsoftonline.com' failed to resolve 'login.microsoftonline.com.workstations.xxx' after 4 queries ` – Sujit J Jun 11 '21 at 08:54