CAS 6.1 - нулевой параметр состояния с Pac4J
Я настроил CAS с LDAP/AD и базой данных, которая работает. Теперь я хочу добавить Keycloak, но получаю исключение по состоянию.
Caused by: org.pac4j.core.exception.TechnicalException: State parameter is different from the one sent in authentication request. Session expired or possible threat of cross-site request forgery
Для тестирования добавил Google, но возникает аналогичная проблема.
DEBUG [org.pac4j.oauth.credentials.extractor.OAuth20CredentialsExtractor] - <sessionState: null / stateParameter: Optional[TST-1-v1va-S-4rLb45kax1568WxwP5aX-q2X]>
INFO [org.pac4j.oauth.client.Google2Client] - <Failed to retrieve or validate credentials: State parameter mismatch: session expired or possible threat of cross-site request forgery>
Я вижу успешную аутентификацию с токеном для keyloak/google в журналах, что означает, что keycloak/google в принципе работают. Проблема заключается в том, что после перенаправления обратно в CAS сеанс уже завершился. Хранилище сеансов внутри контекста пусто. Следовательно, состояние равно нулю и не может быть сопоставлено с TST. Когда я установилwithState = false
в pac4j все работает, но я хочу использовать состояние для безопасности.
В этом вопросе в группе pac4j google у кого-то была такая же проблема, потому что он не использовал стандартный порт, что я тоже использовал. Но переход на 80/443 не решил для меня. Я работаю в tomcat 9 с самоподписанным сертификатом ssl на localhost.
Есть другие предложения?
Изменить
Я почти уверен, проблема связана с внешним котом. Но пока я не нашел рабочей документации о том, как правильно настроить внешний tomcat. Открыт для предложений.
Обновить
швы какcas-server-support-oauth-webflow
нарушает веб-поток pac4j. Если я удалю эту зависимость, все заработает. Не знаю, является ли это ошибкой или должно так работать. Без OAuth-Webflow я не получаю access_token для Ldap/database.
1 ответ
У меня была такая же проблема, и мне удалось справиться с ней с помощью v6.2.0-RC2
версия cas. После добавления
cas.authn.pac4j.replicateSessions=false
в мой etc/cas/config/cas.properties
это решило проблему для меня.
# cas.authn.pac4j.typedIdUsed=false
# cas.authn.pac4j.principalAttributeId=
# cas.authn.pac4j.name=
# cas.authn.pac4j.order=
# cas.authn.pac4j.lazyInit=true
# cas.authn.pac4j.replicateSessions=true
/**
* Indicates whether profiles and other session data,
* collected as part of pac4j flows and requests
* that are kept by the container session, should be replicated
* across the cluster using CAS and its own ticket registry.
* Without this option, profile data and other related
* pieces of information should be manually replicated
* via means and libraries outside of CAS.
*/
private boolean replicateSessions = true;
Предупреждение - значение по умолчанию для этого свойстваtrue
и переход на false
не рекомендуется для кластеров.