首页 > 解决方案 > Kong OIDC:发现 url 超时

问题描述

我正在为我的应用程序构建 kong + kong-oidc + keycloak 堆栈。所有这些都部署到 minikube 集群中。

我想要实现的是使用 Google Identity Provider 执行 Open ID Connect。

我指的是这篇博文来设置https://www.jerney.io/secure-apis-kong-keycloak-1/

唯一的区别是我没有使用 docker-compose,而是使用 minikube 来构建堆栈,并且 keycloak 版本是image: jboss/keycloak:10.0.1.

以下是我已采取的步骤:

  1. 设置 Keycloak 暴露为 NodePort
  2. 创建 keycloak 领域 + 客户端
  3. 设置金刚
  4. 安装 kong-oidc
  5. 定义入口网关
  6. 使用第 2 步中的 OIDC 配置 + keycloak 客户端的详细信息配置 Kong 入口

当我使用 IP 地址设置它时,一切正常。我管理浏览器我的应用程序,它被重定向到谷歌登录页面。

接下来,当我将我的IP地址与域名+ SSL加密绑定时。kong-oidc 无法访问我的 keycloak 发现 URL。

以下是我从浏览器中得到的错误。由于隐私,我已将所有域更改为example.com

I browsed https://example.com/data 它等待了大约 1 分钟,然后结果显示: accessing discovery url (https://keycloak.example.com/auth/realms/example/.well-known/openid-configuration) failed: timeout

我有一个域说example.com,和一个子域keycloak.example.com。一旦我在 Kong 代理后面设置了 Keycloak,我就删除了 NodePort 设置。

以下是我的入口定义 example.com

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway-api
  annotations:
    kubernetes.io/tls-acme: "true"
    cert-manager.io/cluster-issuer: letsencrypt-prod
    konghq.com/plugins: oidc
spec:
  tls:
  - secretName: gateway-api
    hosts:
    - example.com
  rules:
  - host: example.com
    http:
      paths:
      - path: /data
        pathType: Prefix
        backend:
          serviceName: data-service
          servicePort: 8080

入口为keycloak.example.com

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway-keycloak
  annotations:
    konghq.com/plugins: transform-function
spec:
  rules:
  - host: keycloak.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: admin-keycloak
          servicePort: 8080

transform-function用于覆盖默认端口转发,以确保 Keycloak 管理控制台能够通过使用keycloak.example.com访问https

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: transform-function
disabled: false
config:
  functions:
    - ngx.var.upstream_x_forwarded_port=443
plugin: post-function

我的 OIDC 插件定义:

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: oidc
disabled: false
config:
  client_id: <client_id>
  client_secret: <client_secret>
  ssl_verify: "true"
  discovery: https://keycloak.example.com/auth/realms/example/.well-known/openid-configuration
  introspection_endpoint: http://admin-keycloak:8080/auth/realms/example/protocol/openid-connect/token/introspect
plugin: oidc

另外,我已经设置了 keycloak 环境PROXY_ADDRESS_FORWARDING: "true"

证书也安装正确,我可以使用 https 浏览器 keycloak 管理控制台。

以下是来自kong pod的日志。 来自容器的日志proxy

2020/05/11 16:12:16 [error] 22#0: *87800 [lua] openidc.lua:483: openidc_discover(): accessing discovery url (https://keycloak.example.com/auth/realms/example/.well-known/openid-configuration) failed: timeout, client: 172.17.0.1, server: kong, request: "GET /data HTTP/2.0", host: "example.com"
172.17.0.1 - - [11/May/2020:16:12:16 +0000] "GET /data HTTP/2.0" 500 130 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"

ingress-controller没有来自容器的错误消息。

我已经没有关于如何解决此错误的想法。有人可以帮忙吗?

标签: keycloakopenid-connectminikubekong

解决方案


推荐阅读