p2-inc / keycloak-events

Useful Keycloak event listener implementations and utilities.
https://phasetwo.io
Other
168 stars 35 forks source link

Unknown error causes instance crash #23

Closed paulwer closed 1 year ago

paulwer commented 1 year ago
WARN [org.keycloak.events] (executor-thread-0) type=REFRESH_TOKEN_ERROR, realmId=e427102e-e35c-4776-a367-eb4b4d180776, clientId=security-admin-console, userId=226b6cdf-cf2c-4234-a7b7-b102a8d189f3, ipAddress=79.216.190.250, error=invalid_token, grant_type=refresh_token, refresh_token_type=Refresh, refresh_token_id=96adee54-ad37-4ce6-8b1b-d184d12f583c, client_auth_method=client-secret
WARN [io.phasetwo.keycloak.events.RunnableTransaction] (executor-thread-0) Error running Runnable: java.lang.NullPointerException: Cannot invoke "org.keycloak.models.RealmModel.getId()" because "realm" is null
   at io.phasetwo.keycloak.model.jpa.JpaWebhookProvider.getWebhooksStream(JpaWebhookProvider.java:53 undefined)
   at io.phasetwo.keycloak.model.WebhookProvider.getWebhooksStream(WebhookProvider.java:17 undefined)
   at io.phasetwo.keycloak.events.WebhookSenderEventListenerProvider.lambda$processEvent$6(WebhookSenderEventListenerProvider.java:92 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.lambda$runJobInTransaction$1(KeycloakModelUtils.java:256 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithResult(KeycloakModelUtils.java:269 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:255 undefined)
   at io.phasetwo.keycloak.events.WebhookSenderEventListenerProvider.processEvent(WebhookSenderEventListenerProvider.java:87 undefined)
   at io.phasetwo.keycloak.events.WebhookSenderEventListenerProvider.processEvent(WebhookSenderEventListenerProvider.java:78 undefined)
   at io.phasetwo.keycloak.events.WebhookSenderEventListenerProvider.lambda$onEvent$0(WebhookSenderEventListenerProvider.java:57 undefined)
   at io.phasetwo.keycloak.events.RunnableTransaction.lambda$commitImpl$0(RunnableTransaction.java:27 undefined)
   at java.base/java.lang.Iterable.forEach(Iterable.java:75 undefined)
   at io.phasetwo.keycloak.events.RunnableTransaction.commitImpl(RunnableTransaction.java:24 undefined)
   at org.keycloak.models.AbstractKeycloakTransaction.commit(AbstractKeycloakTransaction.java:48 undefined)
   at org.keycloak.services.DefaultKeycloakTransactionManager.commit(DefaultKeycloakTransactionManager.java:146 undefined)
   at org.keycloak.services.DefaultKeycloakSession.closeTransactionManager(DefaultKeycloakSession.java:502 undefined)
   at org.keycloak.services.DefaultKeycloakSession.close(DefaultKeycloakSession.java:469 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithResult(KeycloakModelUtils.java:274 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:255 undefined)
   at org.keycloak.events.EventBuilder.send(EventBuilder.java:237 undefined)
   at org.keycloak.events.EventBuilder.error(EventBuilder.java:224 undefined)
   at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.refreshTokenGrant(TokenEndpoint.java:555 undefined)
   at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequestInternal(TokenEndpoint.java:221 undefined)
   at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.access$100(TokenEndpoint.java:131 undefined)
   at org.keycloak.protocol.oidc.endpoints.TokenEndpoint$1.runInternal(TokenEndpoint.java:185 undefined)
   at org.keycloak.common.util.ResponseSessionTask.run(ResponseSessionTask.java:67 undefined)
   at org.keycloak.common.util.ResponseSessionTask.run(ResponseSessionTask.java:44 undefined)
   at org.keycloak.models.utils.KeycloakModelUtils.runJobInRetriableTransaction(KeycloakModelUtils.java:299 undefined)
   at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequest(TokenEndpoint.java:178 undefined)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77 undefined)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 undefined)
   at java.base/java.lang.reflect.Method.invoke(Method.java:568 undefined)
   at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170 undefined)
   at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130 undefined)
   at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:660 undefined)
   at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:524 undefined)
   at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:474 undefined)
   at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364 undefined)
   at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:476 undefined)
   at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:434 undefined)
   at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:192 undefined)
   at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:152 undefined)
   at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:183 undefined)
   at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:141 undefined)
   at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:32 undefined)
   at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492 undefined)
   at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261 undefined)
   at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161 undefined)
   at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364 undefined)
   at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164 undefined)
   at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247 undefined)
   at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73 undefined)
   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:151 undefined)
   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:82 undefined)
   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:42 undefined)
   at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284 undefined)
   at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173 undefined)
   at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140 undefined)
   at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:84 undefined)
   at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:71 undefined)
   at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284 undefined)
   at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173 undefined)
   at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140 undefined)
   at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:430 undefined)
   at io.quarkus.vertx.http.runtime.VertxHttpRecorder$6.handle(VertxHttpRecorder.java:408 undefined)
   at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284 undefined)
   at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:173 undefined)
   at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:140 undefined)
   at org.keycloak.quarkus.runtime.integration.web.QuarkusRequestFilter.lambda$createBlockingHandler$0(QuarkusRequestFilter.java:82 undefined)
   at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:576 undefined)
   at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449 undefined)
   at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478 undefined)
   at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29 undefined)
   at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29 undefined)
   at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30 undefined)
   at java.base/java.lang.Thread.run(Thread.java:833 undefined)
xgp commented 1 year ago

I've seen things like this when running in a KeycloakTransaction. Because you're in a different session, any *Model instances from the parent session are null. However, I don't know why it's intermittent. I think the correct solution is to store the realm ID as a String, and then load a fresh RealmModel inside the transaction.

xgp commented 1 year ago

@paulwer Try running against this branch and see if you get the same error https://github.com/p2-inc/keycloak-events/tree/xgp/23-webhook-crash

paulwer commented 1 year ago

i am using the docker image, any way to bunde this, so i can start from there?

xgp commented 1 year ago

I believe you can just mount the jar as a volume in place of the existing events jar in /opt/keycloak/providers/ dir.