如何在 JAX-RS 应用程序中检查 Keycloak 发出的 JWT 令牌的 REST 请求

How to check REST requests for JWT token issued by Keycloak in JAX-RS application

我知道这个问题可能不是明确关于“编程”的,但我遇到了一些麻烦 理解这个概念。也许你能帮上忙。

基本上,我正在部署 WAR 提供基于 JAX-RS 的多个 REST 端点到 WildFly 20 服务器。

这是基线:

这是我目前拥有的:

React 客户端

该应用程序集成了 keycloak-js 适配器。任何登录都通过 Keycloak 进行路由,Keycloak 会发出一个 JWT 令牌,该令牌用于应用程序的所有进一步请求,即它们包含 Authorization: Bearer <token> header。检查。

JAX-RS在WildFly中的应用

web.xml

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>api</web-resource-name>
            <url-pattern>/users/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>KEYCLOAK</auth-method>
        <realm-name>this is ignored currently</realm-name>
    </login-config>

    <security-role>
        <role-name>*</role-name>
    </security-role>

keycloak.json

{
  "realm": "my-realm",
  "auth-server-url": "${keycloak.url}/auth",
  "ssl-required": "none",
  "resource": "my-client",
  "public-client": true,
  "confidential-port": 0,
  "principal-attribute" : "preferred_username",
  "enable-cors": true
}

(展示)问题

对 http://localhost:8090/api/users 的初始请求将用户重定向到 Keycloak 登录。成功登录后,无需发送身份验证 header 即可访问相同的 URL 。这就是我被困的地方。我的理解是我需要告诉我的服务器应用程序“嘿,如果它包含由 Keycloak 发出的有效 JWT 令牌,请检查对此 URL 的任何传入请求”。

我认为有一些方法可以让 WildFly 准确地处理这个问题。还是我必须自己实现一些 JWT 验证服务?

如果您根本不想被重定向到登录页面,并且 /users 路径未用于提供任何网络内容(例如 jsp、html 等.),那么可以安全地告诉 Keycloak /users 只能通过“Bearer”令牌访问。然后,如果请求中不存在这样的令牌,它只是 returns 正确的 HTTP 状态代码并且不执行任何操作。您可以通过在 keycloak.json 文件中将 bearer-only 属性 设置为 true 来实现。所以你的文件应该是这样的:

{
  "realm": "my-realm",
  "auth-server-url": "${keycloak.url}/auth",
  "ssl-required": "none",
  "resource": "my-client",
  "public-client": true,
  "confidential-port": 0,
  "principal-attribute" : "preferred_username",
  "enable-cors": true,
  "bearer-only": true
}