Обычный выход из системы и выход из обратного канала - это две разные вещи.
Обычный выход из системы работает , перенаправляя браузер на URL, который вы упомянули в (2). Пользователь распознается сеансом браузера в Keycloak, поэтому перенаправление браузера имеет решающее значение (redirect_uri даже не требуется предоставлять).
Мы достигли этого в Tomcat, вызвав следующий код в нашем приложении, который сам запускает перенаправление (используя, конечно, keycloak.json):
Object keycloakAttr = request.getAttribute(KeycloakSecurityContext.class.getName());
if (keycloakAttr != null && keycloakAttr instanceof RefreshableKeycloakSecurityContext)
{
// code inspired by org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.logoutInternal
RefreshableKeycloakSecurityContext ksc = (RefreshableKeycloakSecurityContext)keycloakAttr;
KeycloakDeployment deployment = ksc.getDeployment();
ksc.logout(deployment);
// Since a CatalinaSessionTokenStore is used as token store in Tomcat
// tokenStore.logout() is not be necessary (???)
request.removeAttribute(KeycloakSecurityContext.class.getName());
request.setUserPrincipal(null);
}
A выход из обратного канала имеет смысл только в том случае, если несколько проверяющих сторон (на языке OIDC) или "клиенты" с точки зрения Keycloak в игре. Это гарантирует, что никакие клиентские сеансы клиентов в одной и той же области (для одного и того же пользователя) не «выживут» при выходе из системы.
После выполнения вышеприведенного выхода Keycloak проверяет, есть ли клиентские сеансы, связанные с сеансом Keycloak, и отправляет запросы на выход из обратного канала соответствующим клиентам (в той же области!), Следовательно, сеанс браузера вообще не участвует в этом процессе. .
Чтобы это работало (как для Node.js, так и для Tomcat с правильно установленным соответствующим адаптером Keycloak) нам было необходимо только правильно настроить URL-адрес администратора клиентов в Keycloak. Примечание. По умолчанию используется значение "/", но для Tomcat должен быть включен контекст веб-приложения, например https://myapp.com/mywebapp/