Spring OAuth2 Keycloak Kubernetes internal/external 访问权限

Spring OAuth2 Keycloak Kubernetes internal/external access

我在 Kubernetes 集群中配置了 Keycloak (10.0.3) 服务器。

keycloak 服务器必须处理外部用户的身份验证(使用外部 url)并处理 Spring 微服务通信的 oauth2 令牌。

然后 Web 应用程序 spring 服务使用 oidc 提供程序:

spring:
  security:
    oauth2:
      client:
        provider:
          oidc:
            issuer-uri: http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm
            authorization-uri: http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm/protocol/openid-connect/auth
            jwk-set-uri: http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm/protocol/openid-connect/certs
            token-uri: http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm/protocol/openid-connect/token
            user-name-attribute: preferred_username

keycloak 的外部 URL 是 https://keycloak.localhost,由 Traefik v2 处理的入口重定向管理

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: keycloak-https
  namespace: keycloak-cluster
  annotations:
    traefik.frontend.passHostHeader: "true"
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`keycloak.localhost`)
      kind: Rule
      services:
        - name: keycloak-cluster-http
          port: 80
  tls:
    options:
      name: mytlsoption
      namespace: traefik
    store:
      name: default

我可以使用 https://keycloak.localhost 访问 Keycloak,没问题,它有效。

问题是当我尝试访问我的网络应用程序时,它总是会重定向到 'http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm',这在 k8s 之外无法解决。

如果我将 issuer-uri 更改为 http://keycloak.localhost 则它不起作用,因为 keycloak.locahost 未在 k8s 中解析。

我尝试将 KEYCLOAK_FRONTEND_URL 设置为 https://keycloak.localhost/auth,但没有任何变化。

拜托,是否有人拥有相同类型的设置并设法使其正常工作?

此致

authorization_uri 需要浏览器理解,因为该 URI 在前端通道中处理。其余 URI 在后台通道中处理。

因此,authorization_uri 应该使用前端通道方式来寻址授权服务器:

authorization_uri: https://keycloak.localhost/auth/realms/myrealm/protocol/openid-connect/auth

EDIT 根据下面 Joe Grandja 的输入,似乎也有必要不指定 issuer-uri 属性。 issuer-uri 属性 是指定其他 URI 的快捷方式,并且由于您正在指定这些 URI,所以您无论如何都不需要它。

设法使用 coredns 修复它并添加重写规则...:

重写名称 keycloak.localhost keycloak-cluster-http.keycloak-cluster.svc.cluster.local

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        rewrite name keycloak.localhost keycloak-cluster-http.keycloak-cluster.svc.cluster.local
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system