From dd37e02140535ce6e2f5e87ca6715ded0a8b46ea Mon Sep 17 00:00:00 2001 From: Daniel Fesenmeyer Date: Wed, 4 Oct 2023 14:23:28 +0200 Subject: [PATCH] Improve logging in case of OIDC Identity provider errors: - log the full Redirection URL, when it contains an error parameter, or does not contain the state or code parameter - log the token endpoint URL (without - possibly confidential - params) and the response body, when the token endpoint does not return a success response Closes #23690 --- .../broker/provider/util/SimpleHttp.java | 7 ++ .../oidc/AbstractOAuth2IdentityProvider.java | 65 +++++++++++++------ .../keycloak/services/messages/Messages.java | 2 + .../login/messages/messages_en.properties | 1 + 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java b/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java index fe743fef203..d40274c159f 100755 --- a/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java +++ b/server-spi-private/src/main/java/org/keycloak/broker/provider/util/SimpleHttp.java @@ -248,6 +248,13 @@ public class SimpleHttp { } } + /** + * @return the URL without params + */ + public String getUrl() { + return url; + } + private Response makeRequest() throws IOException { HttpRequestBase httpRequest = createHttpRequest(); diff --git a/services/src/main/java/org/keycloak/broker/oidc/AbstractOAuth2IdentityProvider.java b/services/src/main/java/org/keycloak/broker/oidc/AbstractOAuth2IdentityProvider.java index 1fb4d684dfe..72242391d48 100755 --- a/services/src/main/java/org/keycloak/broker/oidc/AbstractOAuth2IdentityProvider.java +++ b/services/src/main/java/org/keycloak/broker/oidc/AbstractOAuth2IdentityProvider.java @@ -479,7 +479,10 @@ public abstract class AbstractOAuth2IdentityProvider= 200 && status < 400; + response = simpleResponse.asString(); + + if (!success) { + logger.errorf("Unexpected response from token endpoint %s. status=%s, response=%s", + simpleHttp.getUrl(), status, response); + return errorIdentityProviderLogin(Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR); + } + } + + BrokeredIdentityContext federatedIdentity = provider.getFederatedIdentity(response); + + if (providerConfig.isStoreToken()) { + // make sure that token wasn't already set by getFederatedIdentity(); + // want to be able to allow provider to set the token itself. + if (federatedIdentity.getToken() == null)federatedIdentity.setToken(response); + } + + federatedIdentity.setIdpConfig(providerConfig); + federatedIdentity.setIdp(provider); + federatedIdentity.setAuthenticationSession(authSession); + + return callback.authenticated(federatedIdentity); } catch (WebApplicationException e) { return e.getResponse(); } catch (IdentityBrokerException e) { @@ -524,10 +541,18 @@ public abstract class AbstractOAuth2IdentityProvider