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 错误