带有外部身份提供者的 Keycloak 失败

Posted

技术标签:

【中文标题】带有外部身份提供者的 Keycloak 失败【英文标题】:Keycloak with external Identity Provider fails 【发布时间】:2020-09-24 02:17:20 【问题描述】:

我已经使用 kubernetes 设置了 keycloak,并使用 google 和 github 作为外部身份提供者创建了新领域。 我创建了一个简单的 spring 安全应用程序,使用 keycloak 配置授权。 我可以对内部用户进行身份验证,并且流程按预期工作。 但是当使用外部身份提供者 google 或 github 时,它会失败并出现类似的异常。在日志中显示

错误 [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider](默认任务 33)无法使身份提供者 oauth 回调:java.net.UnknownHostException:oauth2.googleapis.com: 名称或服务未知 在 java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(本机方法) 在 java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929) 在 java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515) 在 java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848) 在 java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505) 在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364) 在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298) 在 org.apache.httpcomponents.core//org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45) 在 org.apache.httpcomponents.core//org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112) 在 org.apache.httpcomponents.core//org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) 在 org.apache.httpcomponents.core//org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) 在 org.apache.httpcomponents.core//org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 在 org.apache.httpcomponents.core//org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) 在 org.apache.httpcomponents.core//org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) 在 org.apache.httpcomponents.core//org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 在 org.apache.httpcomponents.core//org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) 在 org.apache.httpcomponents.core//org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 在 org.apache.httpcomponents.core//org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108) 在 org.apache.httpcomponents.core//org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 在 org.keycloak.keycloak-server-spi-private@10.0.0//org.keycloak.broker.provider.util.SimpleHttp.makeRequest(SimpleHttp.java:222) 在 org.keycloak.keycloak-server-spi-private@10.0.0//org.keycloak.broker.provider.util.SimpleHttp.asResponse(SimpleHttp.java:180) 在 org.keycloak.keycloak-server-spi-private@10.0.0//org.keycloak.broker.provider.util.SimpleHttp.asString(SimpleHttp.java:172) 在 org.keycloak.keycloak-services@10.0.0//org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider$Endpoint.authResponse(AbstractOAuth2IdentityProvider.java:470) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.jboss.resteasy.resteasy-jaxrs@3.11.0.Final//org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:138) 在 org.jboss.resteasy.resteasy-jaxrs@3.11.0.Final//org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:526)

是因为,keycloak 在 kubernetes 集群下运行吗?堆栈显示 java.net.UnknownHostException: oauth2.googleapis.com 并且不确定如何克服此错误。 请告诉我。

【问题讨论】:

你能在你的 Pod 中 ping oauth2.googleapis.com 吗? oauth2.googleapis.com 似乎无法正确解析。 我尝试 ping 和 nslookup,但无法解析 oauth2.googleapis.com。问题的原因是我的称为 coredns pod 的 kubernetes dns 没有准备好。这些都失败了,因此导致了这个未知的主机异常。解决这个问题。 【参考方案1】:

这个问题的背景很少。 环境:Minikube 以 driver=none、kubernetes、keycloak 和 helm 集群开始,使用在 ubuntu 19.04 上运行的现有 postgres-ha 11

为了测试 ping:我部署了 kuberentes dnsutils 并遵循了调试步骤。 我无法从 pod 内 ping 任何 google.com。 还有命令

kubectl 获取 pod --namespace=kube-system -l k8s-app=kube-dns

显示 coredns 没有准备好或运行。 这就是这个问题的原因。在挖掘了其他几个帖子之后,尤其是这个 one,我修复了 coredns 以启动,其余的事情都完成了。 HTH。

【讨论】:

以上是关于带有外部身份提供者的 Keycloak 失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 和 Keycloak 因自定义身份验证提供程序而失败

Keycloak集成三方身份提供者的注销流程

如何检查来自另一个 keycloak 实例 B 的身份验证 keycloak 实例 A 用户?

Keycloak OpenID 连接 - Github

Keycloak SAML 集成

Keycloak:如何仅通过身份提供者登录