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
我在 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