Настройка Saml с Keycloak в качестве Identity Broker и Okta в качестве поставщика Identity не работает - PullRequest
0 голосов
/ 13 февраля 2020

Я использую Keycloak (версия 8.0.1) в качестве брокера идентификации в моем приложении. Я настроил интеграцию saml между keycloak / okta, как указано в этом блоге, https://ultimatesecurity.pro/post/okta-saml/

У меня также есть пример приложения, которое я использую для тестирования этой интеграции, которая из этого блог, https://scalac.io/user-authentication-keycloak-1

Я столкнулся с проблемой, когда okta перенаправляет обратно в keycloak. Ответ от okta успешен, однако, получив ключ ответа, смотрит на повара KC_RESTART ie и пытается найти ребенка в JWT, который закодирован в этом поваре ie, но не находит соответствия и выдает следующее исключение:

19:26:00,581 DEBUG [org.keycloak.jose.jws.DefaultTokenManager] (default task-1) Failed to decode token: org.keycloak.common.VerificationException: Key not found
    at org.keycloak.crypto.ServerMacSignatureVerifierContext.getKey(ServerMacSignatureVerifierContext.java:31)
    at org.keycloak.crypto.ServerMacSignatureVerifierContext.<init>(ServerMacSignatureVerifierContext.java:25)
    at org.keycloak.crypto.MacSecretSignatureProvider.verifier(MacSecretSignatureProvider.java:39)
    at org.keycloak.jose.jws.DefaultTokenManager.decode(DefaultTokenManager.java:94)
    at org.keycloak.protocol.RestartLoginCookie.restartSession(RestartLoginCookie.java:146)
    at org.keycloak.services.resources.SessionCodeChecks.restartAuthenticationSessionFromCookie(SessionCodeChecks.java:376)
    at org.keycloak.services.resources.SessionCodeChecks.initialVerifyAuthSession(SessionCodeChecks.java:197)
    at org.keycloak.services.resources.SessionCodeChecks.initialVerify(SessionCodeChecks.java:204)
    at org.keycloak.services.resources.IdentityBrokerService.parseSessionCode(IdentityBrokerService.java:1027)
    at org.keycloak.services.resources.IdentityBrokerService.parseEncodedSessionCode(IdentityBrokerService.java:1016)
    at org.keycloak.services.resources.IdentityBrokerService.authenticated(IdentityBrokerService.java:501)
    at org.keycloak.broker.saml.SAMLEndpoint$Binding.handleLoginResponse(SAMLEndpoint.java:485)
    at org.keycloak.broker.saml.SAMLEndpoint$Binding.handleSamlResponse(SAMLEndpoint.java:524)

Я также включил ведение журнала TRACE для Keycloak, и я вижу следующее сообщение об ошибке, печатаемое в журналах,

До исключения,

19:32:19,019 TRACE [org.keycloak.keys.DefaultKeyManager] (default task-1) Failed to find public key: realm=MyDemo kid=5a148511-021f-477d-a716-2f0f2d425d12 algorithm=HS256 use=SIG

После исключения

19:32:19,021 TRACE [org.keycloak.events] (default task-1) type=IDENTITY_PROVIDER_LOGIN_ERROR, realmId=MyDemo, clientId=null, userId=null, ipAddress=127.0.0.1, error=invalid_code, requestUri=http://localhost:8080/auth/realms/MyDemo/broker/samlokta/endpoint, cookies=[io=URgKM5wjPjr8WQdlAAAA, JSESSIONID=57782504027A376E7FD18A7F061B7225, KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1YTE0ODUxMS0wMjFmLTQ3N2QtYTcxNi0yZjBmMmQ0MjVkMTIifQ.eyJjaWQiOiJhY2NvdW50IiwicHR5Ijoib3BlbmlkLWNvbm5lY3QiLCJydXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL015RGVtby9hY2NvdW50L2xvZ2luLXJlZGlyZWN0IiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvTXlEZW1vIiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiOiJwbGFpbiIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hdXRoL3JlYWxtcy9NeURlbW8vYWNjb3VudC9sb2dpbi1yZWRpcmVjdCIsInN0YXRlIjoiMC9mMjBkNTU4ZS00M2I0LTRkMjEtOTFlYy0xOGY0YmQzYmE0OWMifX0.Y0zN-c33soimR_JhvTex-nRKL0rZKquOhRtfdofrF-A, AUTH_SESSION_ID=e549d547-0bd0-413e-986c-361bb35ead4c.moizs-mbp, OAuth_Token_Request_State=6d9150e4-fb5f-45c9-bda5-3a042d964e4c]

Глядя на код в DefaultKeyManager. java выясняется, что ребенок, находящийся в кулинарии KC_RESTART ie, не найден в KeyProvider.

Мне нужна помощь, чтобы выяснить, почему нет, я не уверен, какой шаг мне не хватает. Любая помощь будет оценена.

        for (KeyProvider p : getProviders(realm)) {
            for (KeyWrapper key : p.getKeys()) {
                if (key.getKid().equals(kid) && key.getStatus().isEnabled() && matches(key, use, algorithm)) {
                    if (logger.isTraceEnabled()) {
                        logger.tracev("Found key: realm={0} kid={1} algorithm={2} use={3}", realm.getName(), key.getKid(), algorithm, use.name());
                    }

                    return key;
                }
            }
        }

1 Ответ

0 голосов
/ 15 февраля 2020

Как оказалось, это была проблема конфигурации. Итак, в основном я использую keycloak на localhost для тестирования. Поэтому я запустил его на локальном хосте и настроил IDP на keycloak. После настройки IDP я экспортировал метаданные и импортировал их в Okta. На этом этапе URI аудитории и URI ответа et c. был импортирован с localhost в качестве имени хоста. После возни я изменил оба URI, чтобы использовать 127.0.0.1 в качестве имени хоста вместо localhost, и это решило проблему.

Я понял, что это может быть проблемой, когда я пытался интегрироваться с PingId. PingId отклонил запрос AuthenticationRequest, потому что entityId - производный от URI не совпадает. Я не совсем уверен, в чем проблема с keycloak, но я хотел опубликовать этот ответ для тех, кто может столкнуться с подобной проблемой.

...