Logout avec connecteur Keycloak ne fonctionne pas correctement

J’ai une erreur 500 lors du logout après connexion via Keycloak

2021-03-01 10:58:36,003 ERROR [com.simplicite.webapp.servlets.ui.MainPublicServlet] SIMPLICITE|http://dev-sim:10608/testkeycloak|/testkeycloak|ERROR|public|com.simplicite.webapp.servlets.ui.MainPublicServlet|service||Event: [1]
    java.lang.NullPointerException
     at java.base/java.io.StringReader.<init>(StringReader.java:50)
     at org.json.JSONTokener.<init>(JSONTokener.java:94)
     at org.json.JSONObject.<init>(JSONObject.java:406)
     at com.simplicite.util.tools.KeycloakTool.getAPIParameters(KeycloakTool.java:60)
     at com.simplicite.util.tools.KeycloakTool.logout(KeycloakTool.java:264)
     at com.simplicite.webapp.servlets.OAuth2Servlet.logout(OAuth2Servlet.java:267)
     at com.simplicite.webapp.servlets.ui.MainPublicServlet.service(MainPublicServlet.java:303)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
     at com.simplicite.webapp.filters.HTTPHeadersFilter.doFilter(HTTPHeadersFilter.java:39)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:86)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
     at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:192)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
     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.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
     at java.base/java.lang.Thread.run(Thread.java:834)

Le logout utilise le logout_url indiqué dans le AUTH_PROVIDERS, mais regarde aussi le paramètre KEYCLOAK_API pour voir s’il faut faire du “debug”, si celui-ci est absent ce qui semble votre cas ça génère un NPE.

On va renforcer le code du logout si KEYCLOAK_API est absent, car effectivement on peut ne pas en avoir besoin. En attendant il faut juste créer un paramètre système vide KEYCLOAK_API = {}

Vous devrez de toute manière le paramétrer pour synchroniser les groupes.

effectivement, depuis que j’ai créé le paramètre système KEYCLOAK_API je n’ai plus d’erreur au logout

Par contre, il y a quand même un soucis. je reviens sur la page de connexion mais quand je clique sur le bouton “Me connecter”, je n’ai pas besoin de ressaisir identifiant et mdp. Le logout n’est pas effectif.

Oui c’est bizarre, dans la log de notre keycloack il y a aussi une erreur lors du logout :

10:20:47,984 WARN  [org.keycloak.events] (default task-29) type=LOGOUT_ERROR, realmId=realmdemo, clientId=simpliciteV5, userId=null, ipAddress=127.0.0.1, error=invalid_client_credentials

invalid_client_credentials : on va vérifier les spécifications, on a dû oublier un paramètre ou un droit de logout…

Trouvé, il y a bien une erreur dans l’appel du logout sur le client_secret lorsque celui-ci n’est pas utilisé, on va corriger.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.