无法验证来自 Keycloak 的令牌

Unable to validate the token from Keycloak

我正在尝试验证从 keycloak 收到的令牌。我创建了 TestClient 作为客户端, TestRealm 作为领域,"user" 作为用户。 在验证收到的令牌时,我正在访问此端点 - http://localhost:8080/auth/realms/TestRealm/protocol/openid-connect/userinfo.

在响应中而不是接收实际的用户详细信息,我每次都会收到此响应:

{
    "sub": "xxxx-xxxx-xxxx-xxxx-xxxxxx",
    "email_verified": false,
    "preferred_username": "service-account-testclient"
}

谁能解释一下?

我不会说您正在进行令牌验证。令牌验证需要令牌签名验证(通常针对使用的领域 public 密钥)。

您只是在 auth header 中使用令牌调用标准 OIDC 用户信息端点,并且 Keycloak 必须执行令牌验证作为请求处理的一部分。 Userinfo 响应取决于您的 Keycloak 客户端配置(映射器、范围等)。

因此,当您收到带有 http 代码 200 的用户信息响应时,令牌必须有效。但是不要将 userinfo 用于 "token validation" - 它会增加不必要的 Keycloak 负载,这是一种缓慢的方法,没有为此指定 userinfo 端点,......进行离线,无状态,快速令牌签名验证。它应该是所有 OIDC 库的标准功能。

要验证令牌,请从 OpenID Connect 标准端点集的 jwks_uri(JSON Web 密钥)端点获取 public 密钥。然后进行签名验证。

有关令牌验证的更多信息,请参阅 this 文章。

正如@JanGaraj 已经指出的那样,通过从 userinfo 端点获得正确的响应,Keycloak 已经验证了令牌。然而,JWT 验证的基本意图是,您的应用程序可以在不依赖任何其他服务的情况下执行此操作。

Keycloak documentation chapter 2.6.2 本身也很好地解释了它,如果您真的需要通过 Keycloak 手动验证令牌,它会为您提供一个选项。

您使用的端点用于获取用户信息,对于令牌验证,端点将类似于 http://localhost:8080/auth/realms/{realm-name}/protocol/openid-connect/token,此格式为标准 OIDC 格式。