Я установил 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 / гугл работа в принципе. Проблема заключается в том, что после перенаправления обратно в CAS сеанс уже завершился. Магазин сессий внутри контекста пуст. Следовательно, состояние равно нулю и не может быть сопоставлено с TST. Когда я устанавливаю withState = false
в pac4j, все работает, но я хочу использовать состояние для безопасности.
В этом вопросе в группе pac4j google у кого-то возникла та же проблема, потому что он не не использовать стандартный порт, который я тоже сделал. Но переход на 80/443 не решил это для меня. Я работаю в Tomcat 9 с подписанным ssl-сертификатом на localhost.
Любые другие предложения?
Edit
Я почти уверен, что проблема связана с внешний кот. Но до сих пор я не нашел рабочей документации о том, как правильно настроить внешний tomcat. Открыто для предложений.
Обновление
Швы, подобные cas-server-support-oauth-webflow
, нарушают веб-поток pac4j. Если я удаляю эту зависимость, это работает. Не знаю, если это ошибка или должна работать таким образом. Без OAuth-Webflow я не получаю access_token для Ldap / database.