使用Keycloak作为Identity Broker和Okta作为Identity provider的Saml设置不起作用

问题描述 投票:0回答:1

我在应用程序中使用密钥斗篷(版本8.0.1)作为身份代理。我已按照此博客中的https://ultimatesecurity.pro/post/okta-saml/

设置了keycloak / okta之间的saml集成

我还有一个示例应用程序,我正在使用它来测试此集成,它来自此博客,https://scalac.io/user-authentication-keycloak-1

okta重定向回keycloak时出现问题。来自okta的响应是成功的,但是在接收到响应密钥时,它会查看KC_RESTART cookie并尝试在JWT中找到一个用该cookie编码的孩子,但找不到匹配项并抛出以下异常,

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日志记录,并且看到以下错误消息正在日志中打印,

例外之前,

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中的代码,似乎在KeyProvider中找不到KC_RESTART cookie中的孩子。

我需要帮助弄清楚为什么不这样做,我不确定我错过了哪一步。任何帮助,将不胜感激。

        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;
                }
            }
        }

java keycloak saml okta
1个回答
0
投票

事实证明,这是一个配置问题。因此,基本上我在localhost上运行keycloak进行测试。因此,我已在localhost上启动它,并在keycloak上配置了IDP。配置IDP之后,我导出了元数据并将其导入Okta。此时,以本地主机作为主机名导入了观众URI和响应URI等。摆弄后,我将两个URI都更改为使用127.0.0.1作为主机名而不是localhost,这解决了该问题。

我有一个线索,当我尝试与PingId集成时这可能是一个问题。 PingId拒绝了AuthenticationRequest,因为从URI派生的EntityId不匹配。我不太确定keycloak的问题是什么,但我想将这个答案发布给其他可能遇到类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.