如何在 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)应能够访问此 API。
- Keycloak 用于对 React 应用程序的用户进行身份验证。
这是我目前拥有的:
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
}
我知道这个问题可能不是明确关于“编程”的,但我遇到了一些麻烦 理解这个概念。也许你能帮上忙。
基本上,我正在部署 WAR 提供基于 JAX-RS 的多个 REST 端点到 WildFly 20 服务器。
这是基线:
- 必须保护端点。
- 前端客户端(基于 React)应能够访问此 API。
- Keycloak 用于对 React 应用程序的用户进行身份验证。
这是我目前拥有的:
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
}