我正在使用 WildFly 应用程序服务器,该服务器在我的本地计算机上托管简单的前端-后端组合。前端通过 Keycloak JS 适配器进行保护,后端预计使用 Keycloak WildFly 适配器。
我已将 keycloak.json 正确放置在适当的位置(在 WEB-INF 文件夹中),并且我的 web.xml 如下所示:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<module-name>restservice</module-name>
<display-name>RESTful Service</display-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>Brokerservice</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>default</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>AuthInterface</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>KEYCLOAK</auth-method>
<realm-name>this is ignored currently</realm-name>
</login-config>
<security-role>
<role-name>default</role-name>
</security-role>
</web-app>
部署进展顺利,我可以访问并登录到该部署中托管的前端,但是当我尝试从后端请求某些内容时,我收到了 401 未经授权。不记名 token 有效并按照 Keycloak 文档的指示发送到服务。同时,控制台显示
Error when sending request to retrieve realm keys: org.keycloak.adapters.HttpClientAdapterException: IO error
完整的服务器日志可用here 。由于此问题仅出现在我的本地 REST 服务中(我可以连接并检索公司网络中其他受 Keycloak 保护的服务的数据),因此我怀疑这是我的 WildFly 配置的问题。目前,它是一个全新安装,仅通过命令行添加并启用了 Keycloak 适配器。
感谢任何形式的帮助。
最佳答案
我的 friend 们,我找到了解决方案!我确实是本地配置问题,但不是在 WildFly 中,而是在我的 Java keystore 中。必须将公司 SSL 证书添加到 cacerts
keystore 中,该 keystore 是与 JAVA_HOME
变量(在我的例子中为 jdk1.8.0_181)关联的 Java 发行版的一部分。具体可以使用这个命令来设置:
keytool -import -keystore "C:\Program Files\Java\jdk1.8.0_181\jre\lib\security\cacerts" -alias [alias] -storepass [password] -file [path/to/your/certificate]
请注意,如果找不到“keytool”,请导航到 JDK 的 bin 并从那里执行命令。执行源在这里不起作用。
关于java - Keycloak 保护的 WildFly REST 服务返回 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52186020/