REST 服务的身份验证不适用于 jBPM(KIE 服务器和业务中心)和 Keycloak
Posted
技术标签:
【中文标题】REST 服务的身份验证不适用于 jBPM(KIE 服务器和业务中心)和 Keycloak【英文标题】:Authentication of REST services not working with jBPM (KIE Server and Business Central) and Keycloak 【发布时间】:2021-02-01 18:35:06 【问题描述】:我正在学习 jBPM(KIE 服务器和业务中心)和 Keycloak。孤立地,我成功地运行了所有这些软件。但是,当我尝试在它们之间进行集成时,网站上的用户身份验证工作(Keycloak 登录页面访问 Business Central 站点),但是 似乎 REST 服务的身份验证来自 KIE 服务器和业务中心的调用,停止工作(未经授权),并且 KIE 服务器无法与其控制器(业务中心)同步。
以下是有关该主题的更多详细信息。
我一直在寻找解决问题的方法,但没有成功。
虽然我已经咨询过这个优秀的网站,但这是我的第一个问题,对于建议将哪个文件附加到该问题上,我没有太多参考。如果您看到具体的文件,请签字,我会附上。
感谢您的帮助。
关于环境和遇到的问题的说明(有用信息):
只有 1 个 Wildfly 20.0.1 环境(服务器)在 Windows 10 上托管 KIE Server 7.43.1.Final、Business Central 7.43.1.Final 和 Keycloak 11.0.2,并安装了 Keycloak 适配器。
在 Keycloak 中,Realm 被创建为 VHLLEmpresaRealm 和 2 个客户端(应用程序):
-
VHLLEmpresaKIEServer:具有公共访问权限。
VHLLEmpresaBusinessCentral:具有机密访问权限。
在 Keycloak 中,用户 kieserver 的密码为 kieserver1!被创建并分配给各种角色(包括 Realm 和 Clients),其中包括:admin、rest-all、kie-server、kiemgmt 和 user。
在与 Keycloak (Keycloak 登录页面)集成的 Business Central 网站上使用 kieserver 用户和您的密码进行身份验证。 Google 身份验证(社交登录)正常工作。
Business Central 配置为显示和管理在 Keycloak 中注册的用户。
观察到的问题:
-
启动 Wildfly 服务器时,KIE 服务器无法与 Controller Business Central 同步(请参阅启动日志 - Doc 06)。下面的尝试在启动时重复了几次,但均未成功,随后出现 NullPointerException,并复制了以下行:
17:13:30,057 INFO [org.kie.server.controller.websocket.client.WebSocketKieServerControllerImpl] (KieServer-ControllerConnect) Kie Server 指向非 Web Socket 控制器 'http://localhost:8080/business-central/ rest/controller',使用默认的 REST 机制 17:13:30,214 错误 [org.keycloak.services.error.KeycloakErrorHandler](默认任务 6)未捕获的服务器错误:java.lang.NullPointerException 在 org.keycloak.storage.StorageId.isLocalStorage(StorageId.java:77) 在 org.keycloak.credential.UserCredentialStoreManager.getStoreForUser(UserCredentialStoreManager.java:54) ... 17:13:30,214 WARN [org.kie.server.services.impl.controller.DefaultRestControllerImpl] (KieServer-ControllerConnect) 在 http://localhost:8080/business-central/rest/controller/server 与控制器同步时遇到异常/wildfly-kieserver error 发送 PUT 请求到 http://localhost:8080/business-central/rest/controller/server/wildfly-kieserver 响应代码 401 时出错
完整文件的链接: https://drive.google.com/file/d/1kr47ap9frsCQB8oyQE2dEm2gfl7__s0G/view?usp=sharing
-
在 Business Central 网站的“部署”页面(也显示服务器)上,KIE 服务器服务器未显示为可用(请参阅 Doc 07)。
完整文件的链接: https://drive.google.com/file/d/1lKiCZdOp7yRvHibfgJ8ZOE_dZIAnkE6U/view?usp=sharing
-
在访问 Business Central REST 服务的 CURL 命令中,即使传递了 kieserver 用户和密码,答案也是未授权的(参见 Doc 08)。
命令: curl -X GET http://kieserver:kieserver1!@localhost:8080/business-central/rest/repositories -v 响应:错误未授权
完整文件的链接:
https://drive.google.com/file/d/1V_CH_hiTkhLh-AtgRvP0YkZ3afwBc4tZ/view?usp=sharing
其他文件:
Wildfly 设置 - STANDALONE-FULL.XML https://drive.google.com/file/d/1f0xvRDPiId1RymZkMGIUaIMB_EuGpbud/view?usp=sharing
【问题讨论】:
【参考方案1】:我不确定这是否是解决问题的正确方法,但是在继续学习和研究几天后,使用 CURL 命令调用 Business Central 服务(如下),我获得了访问权限Token,通过jwt.io网站,我注意到在这个Token的内容中,audience(aud)字段没有填写请求Token的Keycloak Client ID。
curl -d "grant_type=password" -d "client_id=VHLLEmpresaBusinessCentral" -d "client_secret=020c8841-50ee-437e-af16-XXXXXXXX" -d "username=kieserver" -d "password=kieserverXXXXX" -d " scope=VHLLEmpresaEscopo" http://localhost:8180/auth/realms/VHLLEmpresaRealm/protocol/openid-connect/token
所以,我创建了一个 Client Scope,我为 Audience 创建了一个 Mapper 来添加 Client 自己的 ID,并将这个 Client Scope 关联到相应的 Client。
第二个必要的更改是用涉及的每个客户的“直接授权”值覆盖直接授权流。
通过上述两项更改,KIE Server 和 Business Central 之间的同步恢复工作。
【讨论】:
以上是关于REST 服务的身份验证不适用于 jBPM(KIE 服务器和业务中心)和 Keycloak的主要内容,如果未能解决你的问题,请参考以下文章
身份验证不适用于使用 NodeJS 进行的谷歌云 API 身份验证