Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'The supplier returned null' message if OIDC server connection fails #27698

Closed
sag1 opened this issue Sep 2, 2022 · 8 comments · Fixed by #27811
Closed

'The supplier returned null' message if OIDC server connection fails #27698

sag1 opened this issue Sep 2, 2022 · 8 comments · Fixed by #27811
Labels
area/oidc kind/bug Something isn't working
Milestone

Comments

@sag1
Copy link

sag1 commented Sep 2, 2022

Describe the bug

Is it really fixed here #26661 ?
I am using oidc-client and followed this guide for config. I am hitting head for many hours without knowing where is error and why NPE. I don't know why there is no explicit message.

Error:
{"timestamp":"2022-09-02T15:22:14.35Z","sequence":99,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus.runtime.Application","level":"ERROR","message":"Failed to start application (with profile prod)","threadName":"main","threadId":1,"mdc":{},"ndc":"","hostName":"powo-backend-staging-7c8f5f7787-vf7xb","processName":"quarkus-run.jar","processId":1,"stackTrace":"java.lang.NullPointerException: The supplier returned null\n\tat io.smallrye.mutiny.operators.uni.UniOnFailureTransform$UniOnFailureTransformProcessor.onFailure(UniOnFailureTransform.java:62)\n\tat io.smallrye.mutiny.operators.uni.builders.UniCreateFromPublisher$PublisherSubscriber.onError(UniCreateFromPublisher.java:81)\n\tat io.smallrye.mutiny.helpers.HalfSerializer.onError(HalfSerializer.java:56)\n\tat io.smallrye.mutiny.helpers.StrictMultiSubscriber.onFailure(StrictMultiSubscriber.java:91)\n\tat io.smallrye.mutiny.subscription.MultiSubscriber.onError(MultiSubscriber.java:73)\n\tat io.smallrye.mutiny.subscription.SerializedSubscriber.onFailure(SerializedSubscriber.java:102)\n\tat io.smallrye.mutiny.operators.multi.MultiRetryWhenOp$RetryWhenOperator.testOnFailurePredicate(MultiRetryWhenOp.java:136)\n\tat io.smallrye.mutiny.operators.multi.MultiRetryWhenOp$RetryWhenOperator.onFailure(MultiRetryWhenOp.java:119)\n\tat io.smallrye.mutiny.subscription.MultiSubscriber.onError(MultiSubscriber.java:73)\n\tat io.smallrye.mutiny.converters.uni.UniToMultiPublisher$UniToMultiSubscription.onFailure(UniToMultiPublisher.java:103)\n\tat io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:54)\n\tat io.smallrye.mutiny.vertx.AsyncResultUni.lambda$subscribe$1(AsyncResultUni.java:37)\n\tat io.smallrye.mutiny.vertx.DelegatingHandler.handle(DelegatingHandler.java:25)\n\tat io.vertx.ext.web.client.impl.HttpContext.handleFailure(HttpContext.java:386)\n\tat io.vertx.ext.web.client.impl.HttpContext.execute(HttpContext.java:380)\n\tat io.vertx.ext.web.client.impl.HttpContext.next(HttpContext.java:355)\n\tat io.vertx.ext.web.client.impl.HttpContext.fire(HttpContext.java:322)\n\tat io.vertx.ext.web.client.impl.HttpContext.fail(HttpContext.java:303)\n\tat io.vertx.ext.web.client.impl.HttpContext.lambda$handleCreateRequest$6(HttpContext.java:486)\n\tat io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:153)\n\tat io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:75)\n\tat io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:230)\n\tat io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)\n\tat io.vertx.core.http.impl.HttpClientImpl.lambda$doRequest$8(HttpClientImpl.java:645)\n\tat io.vertx.core.net.impl.pool.Endpoint.lambda$getConnection$0(Endpoint.java:52)\n\tat io.vertx.core.http.impl.SharedClientHttpStreamEndpoint$Request.handle(SharedClientHttpStreamEndpoint.java:162)\n\tat io.vertx.core.http.impl.SharedClientHttpStreamEndpoint$Request.handle(SharedClientHttpStreamEndpoint.java:123)\n\tat io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:55)\n\tat io.vertx.core.impl.ContextBase.emit(ContextBase.java:239)\n\tat io.vertx.core.net.impl.pool.SimpleConnectionPool$ConnectFailed$1.run(SimpleConnectionPool.java:384)\n\tat io.vertx.core.net.impl.pool.CombinerExecutor.submit(CombinerExecutor.java:50)\n\tat io.vertx.core.net.impl.pool.SimpleConnectionPool.execute(SimpleConnectionPool.java:245)\n\tat io.vertx.core.net.impl.pool.SimpleConnectionPool.lambda$connect$2(SimpleConnectionPool.java:259)\n\tat io.vertx.core.http.impl.SharedClientHttpStreamEndpoint.lambda$connect$2(SharedClientHttpStreamEndpoint.java:104)\n\tat io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:153)\n\tat io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:75)\n\tat io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:230)\n\tat io.vertx.core.impl.future.Composition$1.onFailure(Composition.java:66)\n\tat io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:75)\n\tat io.vertx.core.impl.future.FailedFuture.addListener(FailedFuture.java:98)\n\tat io.vertx.core.impl.future.Composition.onFailure(Composition.java:55)\n\tat io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:75)\n\tat io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:230)\n\tat io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)\n\tat io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:55)\n\tat io.vertx.core.impl.ContextBase.emit(ContextBase.java:239)\n\tat io.vertx.core.net.impl.NetClientImpl.failed(NetClientImpl.java:302)\n\tat io.vertx.core.net.impl.NetClientImpl.lambda$connectInternal$4(NetClientImpl.java:270)\n\tat io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)\n\tat io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552)\n\tat io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)\n\tat io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:184)\n\tat io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:35)\n\tat io.vertx.core.net.impl.NetClientImpl.connectInternal(NetClientImpl.java:256)\n\tat io.vertx.core.net.impl.NetClientImpl.lambda$connectInternal$5(NetClientImpl.java:275)\n\tat io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)\n\tat io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n"}
{"timestamp":"2022-09-02T15:22:14.351Z","sequence":100,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus.runtime.Application","level":"DEBUG","message":"Stopping application","threadName":"main","threadId":1,"mdc":{},"ndc":"","hostName":"powo-backend-staging-7c8f5f7787-vf7xb","processName":"quarkus-run.jar","processId":1}
{"timestamp":"2022-09-02T15:22:14.352Z","sequence":101,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus.runtime.Application","level":"DEBUG","message":"Shutting down with exit code 1","threadName":"main","threadId":1,"mdc":{},"ndc":"","hostName":"powo-backend-staging-7c8f5f7787-vf7xb","processName":"quarkus-run.jar","processId":1}

Expected behavior

The message "OIDC Server is not available" should be thrown instead of NPE

Actual behavior

java.lang.NullPointerException: The supplier returned null

How to Reproduce?

My code :
@path("/auth")
public class LoginResource {
@Inject
OidcClient oidcClient;

public Response ssoAuthentication(@QueryParam("code") String code) {
    Map<String, String> grantParams = new HashMap<>();
    grantParams.put(OidcConstants.CODE_FLOW_CODE, code);
    grantParams.put(OidcConstants.CODE_FLOW_REDIRECT_URI, redirectUriParam);
    Tokens tokens = oidcClient.getTokens(grantParams).await().indefinitely();
     Cookie cookieAccessToken = Cookie.cookie("accesstoken", accessToken).setSameSite(CookieSameSite.STRICT).setMaxAge(tokens.getAccessTokenExpiresAt());
     return Response.status(RestResponse.Status.FOUND).location(uri)
            .header(HttpHeaders.SET_COOKIE, cookieAccessToken.encode())

}
}

My application.properties:
quarkus.oidc-client.auth-server-url=https://auth.tech.okta
quarkus.oidc-client.client-id=aaaaa-bbbbbb-cccc-dddd-fffff
quarkus.oidc-client.credentials.client-secret.value=zsdsfdazerty
quarkus.oidc-client.credentials.client-secret.method=post
quarkus.oidc-client.grant.type=code

Output of uname -a or ver

No response

Output of java -version

No response

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.11.1.Final

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

@sag1 sag1 added the kind/bug Something isn't working label Sep 2, 2022
@quarkus-bot quarkus-bot bot added the area/oidc label Sep 2, 2022
@quarkus-bot
Copy link

quarkus-bot bot commented Sep 2, 2022

/cc @pedroigor, @sberyozkin

@sberyozkin
Copy link
Member

@sag1 Sorry to hear about it, that initial PR addressed a similar issue which can happen after OidcClient has been initialized, but looks like we need to do a similar update at

, would you like to give it a try ? The only difference is that it should be OidcEndpointAccessException which should be thrown - as this code is shared between quarkus-oidc and quarkus-oidc-client - but it will be wrapped correctly in the OIDC client for example.

@sag1
Copy link
Author

sag1 commented Sep 2, 2022

Thanks @sberyozkin, sure, I can try it.

@sberyozkin
Copy link
Member

Thanks @sag1

@famod
Copy link
Member

famod commented Sep 2, 2022

This problematic pattern is also present in:

  • CommonPanacheQueryImpl
  • KeycloakDevServicesProcessor
  • OidcProviderClient

See grep -R --include=*.java --exclude-dir=target '\.onFailure\(\).*getCause' .

@geoand
Copy link
Contributor

geoand commented Sep 5, 2022

Yeah, we definitely need to fix those

@sberyozkin
Copy link
Member

@sag1 I've opened #27811 as we need to fix it for 2.13.0.CR1, thanks for reporting the problem

@sag1
Copy link
Author

sag1 commented Sep 8, 2022

Thank you for taking this into account @sberyozkin. I am eagerly waiting for the release

@quarkus-bot quarkus-bot bot added this to the 2.13 - main milestone Sep 8, 2022
@gsmet gsmet modified the milestones: 2.13 - main, 2.12.2.Final Sep 12, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/oidc kind/bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants