1

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?

6
  • 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(); ``` Commented Apr 19, 2021 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.. Commented Apr 19, 2021 at 14:50
  • can you update the question for readability please? Commented Apr 20, 2021 at 13:22
  • @baywet updated Commented Apr 21, 2021 at 4:14
  • @baywet I have tested with ms graph 3.3.0, however the results are the same. Commented Apr 22, 2021 at 8:20

1 Answer 1

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

Sign up to request clarification or add additional context in comments.

4 Comments

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?
I'm not sure, I suggest you report this issue here. Also, don't forget to mark as answer. github.com/Azure/azure-sdk-for-java
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
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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.