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



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

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

这是基线:

  • 必须保护端点
  • 前端客户端(基于React(应能够访问此API
  • Key斗篷正被用来验证React应用程序的用户

这就是我目前所拥有的:

React客户端

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

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>

keycapture.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重定向用户Keycloft登录。成功登录后,可以访问相同的URL,而无需发送身份验证标头。这就是我陷入困境的地方。我的理解是,我需要告诉我的服务器应用程序";嘿,如果这个URL包含Keycloft发布的有效JWT令牌,请检查它的任何传入请求;。

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

如果您根本不想被重定向到登录页面,并且/users路径不用于提供任何web内容(例如jsp、html等(,那么可以安全地告诉Key斗篷/users只能通过"Bearer";代币。然后,在请求中不存在这样的令牌的情况下,它只返回正确的HTTP状态代码,不执行任何操作。您可以通过在keycapture.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
}

最新更新