0

添加match-claims到配置文件似乎没有做任何事情。实际上,Gatekeeper在打开资源(有或没有属性)时总是给我同样的错误。

我的Keycloak服务器位于 docker 容器内,可从内部网络http://keycloak:8080访问,就像从外部网络访问http://localhost:8085.

我让Gatekeeper连接到内部网络中的 Keycloak 服务器。该请求来自外部请求,因此,discovery-url不会匹配“iss”令牌声明。

Gatekeeper 正试图使用discovery-url​​ as 'iss'声明。为了覆盖这一点,我添加了match-claims如下属性:

discovery-url: http://keycloak:8080/auth/realms/myRealm
match-claims:
  iss: http://localhost:8085/auth/realms/myRealm

日志如下所示:

启动时

keycloak-gatekeeper_1  | 1.5749342705316222e+09 info    token must contain
  {"claim": "iss", "value": "http://localhost:8085/auth/realms/myRealm"}

keycloak-gatekeeper_1  | 1.5749342705318246e+09 info    keycloak proxy service starting
  {"interface": ":3000"}

根据要求

keycloak-gatekeeper_1  | 1.5749328645243566e+09 error   access token failed verification
  { "client_ip": "172.22.0.1:38128",
    "error": "oidc: JWT claims invalid: invalid claim value: 'iss'.
           expected=http://keycloak:8080/auth/realms/myRealm,
           found=http://localhost:8085/auth/realms/myRealm."}

这最终导致403 Forbidden响应。


我已经在Keycloak-Gatekeeper 8.0.05.0.0上尝试过,两者都有同样的问题。

  1. 这应该按照我尝试使用它的方式工作吗?
  2. 如果没有,我缺少什么?,我如何验证iss或绕过此验证?(最好是前者)?
4

2 回答 2

1

在发现数据验证期间失败 - 您的设置违反了 OIDC 规范

返回的颁发者值必须与直接用于检索配置信息的颁发者 URL 相同。这也必须与从该发行者发行的 ID 令牌中的 iss Claim 值相同。

这是必须的,所以你不能禁用它(除非你想破解源代码——它应该在 coreos/go-oidc 库中)。正确配置您的基础设施设置(例如,在内部/外部网络中为 Keycloak 使用相同的 DNS 名称,为内部网络请求重写内容,...),您会没事的。

于 2019-11-28T18:10:59.057 回答
0

将 DNS 名称更改为host.docker.internal

  1. 令牌端点:http://host.docker.internal/auth/realms/example-realm/open-id-connect/token

  2. 您的属性文件中的颁发者 URL 为http://host.docker.internal/auth/realms/example-realm

这样,外部世界的访问和对 keycloak 的内部调用都可以实现

于 2022-02-26T08:05:19.190 回答