Repository navigation
Replies: 2 comments 7 replies
|
It looks like from the logs you expect a redirect to https://front-end-client-url.com:443, is that correct? Can you share what you have configured the client valid redirect uris as? Something similar was brought up in #37153 - the code path for determining the redirect should be: Unfortunately not all of the code branches there have logs, so it may not completely clear from a debug log what is going on. |
Most code in keycloak does not consider those headers directly, rather they are used to determine the effective request origin. In this case that seems to be https://reverse-proxy-iis-url:50000 Without the proxy-header setting the request would be seen as using the scheme / host / port of the keycloak server (http://localhost:8080 ?), not the proxy server. Also note that on keycloak 26.2 that hostname-strict-https=false, and proxy=edge are not valid configuration options.
In double checking what you provided, it looks like your valid redirect URIs should work. Can you confirm that using just * gives you the same behavior? If so then we'll need to look beyond the redirect validation logic. As for additional troubleshooting it may be worth a try to step up to trace logging. At the very least I'd expect that to show Keycloak is returning a 302 to localhost. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Hi, I am looking for some guidance on how to continue pursuing / troubleshooting this issue I am encountering (or hopefully explain what I've likely misconfigured). (using version 26.2.4)
I have a working client setup/integration with keycloak using the standard flow. The client has a valid redirect_uri defined that redirects back to my application. The full flow is working as expected, but in moving to production I would prefer IIS to handle all certification handling. As such, I've made an effort to move/re-configure my keycloak instance to support a reverse-proxy through IIS.
I have thing working to a degree; my reverse proxy successfully forwards my request to localhost:8080 and prompts me with a login-screen. Much like my existing setup, I can see that the url includes a valid redirect uri. Upon successful login; I am however redirected to my reverse proxy's base url; resulting in the opening the admin console.
I have tried to run keycloak with log-level DEBUG, but am having issues identifying the reason behind this behavior. Related logs can be found below:
What I fail to understand is why the valid url (which worked before setting up the reverse-proxy) is now not being used; and instead keycloak is opting to use the x-forwarded http headers instead.
Let me know if any additional info is needed to help troubleshoot further. Thanks!
LOG EXTRACT
2025-05-21 21:47:22,027 DEBUG [org.hibernate.event.internal.AbstractSaveEventListener] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Generated identifier: component[clientId,clientStorageProvider,externalClientId,offline,userSessionId]{offline=0, clientId=bad53b5d-5c67-41d3-a519-8f122af39294, clientStorageProvider=local, externalClientId=local, userSessionId=9f717f2d-7ea7-48b9-b18f-e93573326c15}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator
2025-05-21 21:47:22,027 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) JtaTransactionWrapper commit. Request Context: Non-HTTP task
2025-05-21 21:47:22,027 DEBUG [org.hibernate.event.internal.AbstractFlushingEventListener] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Processing flush-time cascades
2025-05-21 21:47:22,027 DEBUG [org.hibernate.event.internal.AbstractFlushingEventListener] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Dirty checking collections
2025-05-21 21:47:22,027 DEBUG [org.hibernate.event.internal.AbstractFlushingEventListener] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
2025-05-21 21:47:22,027 DEBUG [org.hibernate.event.internal.AbstractFlushingEventListener] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2025-05-21 21:47:22,027 DEBUG [org.hibernate.internal.util.EntityPrinter] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Listing entities:
2025-05-21 21:47:22,027 DEBUG [org.hibernate.internal.util.EntityPrinter] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) org.keycloak.models.jpa.session.PersistentClientSessionEntity{data={"authMethod":"openid-connect","redirectUri":"https://front-end-client-url.com:443/","notes":{"clientId":"bad53b5d-5c67-41d3-a519-8f122af39294","scope":"openid api-client-test.all","userSessionStartedAt":"1747856841","iss":"https://reverse-proxy-iis-url:50000/realms/test_realm","startedAt":"1747856841","response_type":"code","level-of-authentication":"-1","code_challenge_method":"S256","redirect_uri":"https://front-end-client-url.com:443/","state":"a8f06f5cd9854fb8988161cf1e0066ae","code_challenge":"5mK7cxKs_K-Zlabh2ZX1LRs-BUX0Zj-HNCsLSmfbEGM"}}, version=0, timestamp=1747856841}
2025-05-21 21:47:22,028 DEBUG [org.hibernate.SQL] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,029 DEBUG [org.hibernate.orm.jdbc.batch] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) PreparedStatementDetails did not contain PreparedStatement on #releaseStatements : insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,029 DEBUG [org.hibernate.engine.transaction.internal.TransactionImpl] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
2025-05-21 21:47:22,029 DEBUG [org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Initiating JDBC connection release from beforeTransactionCompletion
2025-05-21 21:47:22,029 DEBUG [org.hibernate.orm.jdbc.batch] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) PreparedStatementDetails did not contain PreparedStatement on #releaseStatements : insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,030 DEBUG [org.hibernate.orm.jdbc.batch] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) PreparedStatementDetails did not contain PreparedStatement on #releaseStatements : insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,030 DEBUG [org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) Initiating JDBC connection release from afterTransaction
2025-05-21 21:47:22,030 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) JtaTransactionWrapper end. Request Context: Non-HTTP task
2025-05-21 21:47:22,030 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) JtaTransactionWrapper resuming suspended user transaction: TransactionImple < ac, BasicAction: 0:ffffac148609:c81c:682e2cfa:1e3 status: ActionStatus.RUNNING >
2025-05-21 21:47:22,030 DEBUG [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) HHH000420: Closing un-released batch
2025-05-21 21:47:22,030 DEBUG [org.hibernate.orm.jdbc.batch] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) PreparedStatementDetails did not contain PreparedStatement on #releaseStatements : insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,030 DEBUG [org.hibernate.orm.jdbc.batch] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) PreparedStatementDetails did not contain PreparedStatement on #releaseStatements : insert into OFFLINE_CLIENT_SESSION (DATA,TIMESTAMP,VERSION,CLIENT_ID,CLIENT_STORAGE_PROVIDER,EXTERNAL_CLIENT_ID,OFFLINE_FLAG,USER_SESSION_ID) values (?,?,?,?,?,?,?,?)
2025-05-21 21:47:22,030 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) JtaTransactionWrapper commit. Request Context: Non-HTTP task
2025-05-21 21:47:22,030 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (org.keycloak.models.sessions.infinispan.changes.PersistentSessionsWorker$BatchWorker) JtaTransactionWrapper end. Request Context: Non-HTTP task
2025-05-21 21:47:22,052 DEBUG [io.quarkus.vertx.http.runtime.ForwardedParser] (vert.x-eventloop-thread-0) Using X-Forwarded-Proto to set scheme to https
2025-05-21 21:47:22,052 DEBUG [io.quarkus.vertx.http.runtime.ForwardedParser] (vert.x-eventloop-thread-0) Using reverse-proxy-iis-url to set host to reverse-proxy-iis-url and port to -1
2025-05-21 21:47:22,052 DEBUG [io.quarkus.vertx.http.runtime.ForwardedParser] (vert.x-eventloop-thread-0) Using X-Forwarded-Port to set port to 50000
2025-05-21 21:47:22,052 DEBUG [io.quarkus.vertx.http.runtime.ForwardedParser] (vert.x-eventloop-thread-0) Recalculated absoluteURI to https://reverse-proxy-iis-url:50000/?state=a8f06f5cd9854fb8988161cf1e0066ae&session_state=9f717f2d-7ea7-48b9-b18f-e93573326c15&iss=https%3A%2F%2Freverse-proxy-iis-url%3A50000%2Frealms%2Ftest_realm&code=9c85f540-3410-445a-a4c9-6b3067207308.9f717f2d-7ea7-48b9-b18f-e93573326c15.bad53b5d-5c67-41d3-a519-8f122af39294
2025-05-21 21:47:22,053 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (executor-thread-8) new JtaTransactionWrapper. Was existing transaction suspended: false Request Context: HTTP GET /
2025-05-21 21:47:22,054 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (executor-thread-8) JtaTransactionWrapper commit. Request Context: HTTP GET /
2025-05-21 21:47:22,054 DEBUG [org.keycloak.transaction.JtaTransactionWrapper] (executor-thread-8) JtaTransactionWrapper end. Request Context: HTTP GET /
keycloak.conf:
http-enabled=true
hostname-strict=false
proxy-headers=xforwarded
hostname-strict-https=false
proxy=edge
All reactions