java - Keycloak 保护的 WildFly REST 服务返回 401 未经授权

标签 java keycloak wildfly-10 http-status-code-401 keycloak-services

我正在使用 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/

相关文章:

java - 使用基本 Java 检查两个字符串是否是彼此的变位词

java - 从一个 Wildfly 10 应用程序连接到另一个应用程序的远程 JMS 队列时出现问题

java - Wildfly 10.1.0 单例不起作用

security - 如何为 jsessionid cookie 启用相同站点

java - Integer.parseInt 混淆

java - Azure IoT 中心 Java SDK 是否支持 X.509 证书?

java - Android - 您可以在自定义适配器中混合类型吗?

kubernetes - Kubernetes 中导出/导入 Keycloak 数据的最佳实践

java - 所有 KeyCloak Admin API 调用上的 NullPointerException

java - Keycloak:无法获取角色的属性