-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Description
Describe the bug
Given I have:
- a Spring OAuth2 client configured with Back-Channel Logout
- an authorization server with Back-Channel Logout configured to call the Spring OAuth2 client
When I try to visit a path requiring to be authorized on the Spring client, then I am redirected to login.
Once authenticated, I can access the protected resource.
When I visit the end_session_endpoint
of the authorization server, then I can see a TRACE
log on the Spring client displaying: Found and removed 1 session(s) from mapping of 1 session(s)
However, if I refresh the tab pointing to the protected resource, I can still access it.
There are two log lines after the one stating that the session was removed:
ExchangeFunctions : [1c75356f] HTTP POST http://host.docker.internal:7080/logout, headers={masked}
ExchangeFunctions : [1c75356f] Cancel signal (to close connection)
Is the client trying to call its own /logout
endpoint but using the wrong hostname? host.docker.internal
is the hostname used by the authorization server to initiate the Back-Channel Logout (which is running in Docker), but this hostname is unknown from the Spring client.
Expected behavior
If the Spring client needs to call itself to actually destroy the user session, shouldn't it call localhost
?
Sample
https://github.com/ch4mpy/spring-security-14553
run docker compose up
to create a new Keycloak instance (admin
/ admin
to access http://localhost:8080/realms/master)
create a new realm by importing spring-security-realm.json
create a user
start the spring boot app
visit http://localhost:7080/
the end_session_endpoint
is at http://localhost:8080/realms/spring-security/protocol/openid-connect/logout