Keycloak 无效的令牌发行者

Posted

技术标签:

【中文标题】Keycloak 无效的令牌发行者【英文标题】:Keycloak Invalid token issuer 【发布时间】:2020-09-09 23:09:26 【问题描述】:

我有一个移动应用(react-native)、一个资源服务(spring boot)和 Keycloak Authenticatioin Service(Auth-Service)。

Client 直接使用 Auth-Service 进行身份验证并获取访问令牌。 当我向资源服务发出请求时,资源服务通过询问 Auth-Service 来检查访问令牌。但是客户端应用和iss字段获取的token是http://10.0.2.2:8060/auth/realms/sau,我的资源服务在http://localhost:8110。

Keycloak 说:error="invalid_token", error_description="Invalid token issuer. Expected 'http://localhost:8060/auth/realms/sau', but was 'http://10.0.2.2:8060/auth/realms/sau'"

我的问题是如何代表我的客户在资源服务中进行身份验证?

移动应用:

 export const prepareRequestBody = credentials => 
  const params = new URLSearchParams();
  params.append('username', credentials.username);
  params.append('password', credentials.password);
  params.append('client_id', "nasilim-mobile-app");
  params.append('grant_type', "password");
  return params;
;

export const login = credentials => 
  const params = prepareRequestBody(credentials);
  return axios.post(LOGIN, params);
;

资源服务:

application.yml

keycloak:
  realm: sau
  resource: photo-service
  bearer-only: false
  auth-server-url: http://localhost:8060/auth
  credentials:
     secret: 69a3e80c-8360-42df-bcec-b6575a6949dc

注意:我检查了this 问题并尝试设置 "X-Forwarded-For" : "http://localhost:8060/" 但它不起作用 Keycloak 返回: "error": "invalid_request", "error_description": "HTTPS required"

这是手机客户端获取的Sample Access Token。

【问题讨论】:

我必须使用keycloak.proxy-url 设置christophewillemsen.com/2021/06/08/… 【参考方案1】:

“iss”声明因请求的功能而异。变量KEYCLOAK_FRONTEND_URL 可以改变这种行为。因此,请尝试在您的 docker-compose 文件中执行以下操作:

KEYCLOAK_FRONTEND_URL: http://10.0.2.2:8060/auth

【讨论】:

【参考方案2】:

如果您无法使用外部地址访问身份验证服务器怎么办?这行不通。检查https://issues.redhat.com/browse/KEYCLOAK-6984 一种解决方法是设置 reaml 公钥。但不建议这样做,因为如果密钥被轮换,适配器将不会检查新密钥。

【讨论】:

【参考方案3】:

您需要以外部方式配置从 Spring Boot 应用程序到 Auth 服务器的访问,而不是 localhost

keycloak:
  realm: sau
  resource: photo-service
  bearer-only: false
  auth-server-url: http://10.0.2.2:8060/auth
  credentials:
     secret: 69a3e80c-8360-42df-bcec-b6575a6949dc

这样令牌发行者将匹配。这可能需要在 keycloak 中禁用外部请求的 SSL 要求或配置正确的 SSL 通信。如果这是用于生产,请按照正确的方式进行。

另请参阅:

https://***.com/a/42504805/1199132

【讨论】:

以上是关于Keycloak 无效的令牌发行者的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak:从内部 docker 容器运行时令牌颁发者无效

Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)

Keycloak:作为 docker 服务运行时令牌颁发者无效

Keycloak 抱怨令牌端点上的 redirect_uri 无效

Keycloak 直接访问授权在 keycloak userinfo 端点上无效

Keycloak:访问令牌验证端点