Keycloak Kubernetes 401 未经授权

Posted

技术标签:

【中文标题】Keycloak Kubernetes 401 未经授权【英文标题】:Keycloak Kubernetes 401 Unauthorized 【发布时间】:2021-01-09 13:11:45 【问题描述】:

我有一个在 Kubernetes 集群上运行的 keycloak 服务器和一个 spring boot 应用程序,我面临 2 个场景,第一个正在工作,另一个我得到 401 Unauthorized。

第一个场景:

在我的 k8s 集群中输入带有 kubectl exec 命令的测试容器,并通过 curl POST 请求请求令牌: http://keycloak-service-name:8080/auth/realms/lisa/protocol/openid-connect/token 我得到一个令牌 我使用该令牌从邮递员发送请求到我的应用程序的安全端点,并且 它正在运行,已授予访问权限

第二种情况:

通过向以下地址发送 POST 请求来请求令牌:http://keycloak-external-ip:port/auth/realms/lisa/protocol/openid-connect/token 以及来自邮递员的必要参数 我收到一个访问令牌 我使用我的应用程序的令牌从邮递员向安全端点发送请求,我得到 401 未授权

Keycloak 使用 NodePort 服务公开。

应用使用 istio 入口网关公开。

Keycloak 服务器版本:9.0.0。

spring boot 应用中的keycloak 版本:10.0.2

【问题讨论】:

这里也是,Keycloak forum发了一个问题。 您好,您可以在您的问题中添加以下内容吗?: 1. 有关对 istio 入口网关的传入请求的详细信息。 2. istio ingress gateway背后的应用细节。 3. 您的 istio 入口网关的日志。 这是我通过 istio 网关发送以测试我的应用程序的请求的卷曲:curl --location --request GET 'gateway-external-ip/history/admin/v1/health' \ --header 'Cookie: JSESSIONID=2C40C674EA1A3D13BEC98313BB3D23C6; JSESSIONID=B1CF761DA1349D2AF40F7DB11FBB2503' \ --header '授权:承载令牌' 该问题很可能与外部调用的 JWT ISS 检查失败有关。在我看来,它是基于本地服务/主机名配置的。您可以通过检查日志来验证这一点。看看这个 githubpost 看看如何查看日志。 【参考方案1】:

通过更改 application.properties 文件中的 keycloak.auth-server-url 值来解决此问题。 keycloak部署有2个服务,一个是clusterIP类型,第二个是nodePort类型

之前

keycloak.auth-server-url=http://keycloak-clusterIP-service-name:8080/auth

之后

keycloak.auth-server-url=http://node-ip-adress:nodePort/auth

【讨论】:

以上是关于Keycloak Kubernetes 401 未经授权的主要内容,如果未能解决你的问题,请参考以下文章

Angular - Spring Boot - Keycloak - 401错误

带有 Keycloak 的 Spring 应用程序返回 401 错误

Keycloak - 令牌过期后在 Ajax 调用中获取 401

Keycloak API 总是返回 401

Keycloak PUT 请求返回 401(未经授权)

对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401