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

时间:2018-09-05 13:12:16

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

我正在使用WildFly应用程序服务器,该服务器在本地计算机上托管简单的Frontend-Backend组合。前端通过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>

部署进行得很顺利,我可以访问并登录到该部署中托管的Frontend,但是当我尝试从后端请求某些内容时,我会收到401 Unauthorized。承载令牌有效,并按照Keycloak文档的指示发送给服务。同时,控制台读取

Error when sending request to retrieve realm keys: org.keycloak.adapters.HttpClientAdapterException: IO error

完整的服务器日志可用here。由于此问题仅与我的本地REST服务有关(我可以在公司网络中从其他受Keycloak保护的服务中连接和检索数据),因此我怀疑这与我的WildFly配置有关。目前,它是全新安装,仅通过命令行添加并启用了Keycloak适配器。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我的朋友们,我找到了俩!我确实是一个本地配置问题,但不是在WildFly中,而是在我的Java Keystore中。公司SSL证书必须添加到cacerts密钥库中,该密钥库是与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并从此处执行命令。执行原点在这里无效。