【问题标题】:Apache Cxf Webclient Doen't Work As Expected in Tomee 8Apache Cxf Webclient 在 Tomee 8 中无法按预期工作
【发布时间】:2020-03-03 15:02:53
【问题描述】:

我正在尝试从 google 获取 jwk 密钥集以用于 Apache Cxf OIDC 和 Jose Libs。当我在独立的 main 方法上运行代码时,代码运行良好。

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        final WebClient client = WebClient.create("https://www.googleapis.com/oauth2/v3/certs", Arrays.asList(new JsonWebKeysProvider()), true).accept(MediaType.APPLICATION_JSON);
        JsonWebKeys keys = client.get(JsonWebKeys.class);
        keys.getKeys().forEach(key -> {
            System.out.println("****************************************************************************");
            System.out.println("ID........." + key.getKeyId());
            System.out.println("Alg........" + key.getAlgorithm());
            System.out.println("Key Type..." + key.getKeyType());
            System.out.println("Use........" + key.getPublicKeyUse());
        });

    }

}

正确打印了 ID、算法、密钥类型和用途,这意味着密钥是属性填充的。

示例输出:

****************************************************************************
ID.........79c809dd1186cc228c4baf9358599530ce92b4c8
Alg........RS256
Key Type...RSA
Use........sig
****************************************************************************
ID.........17d55ff4e10991d6b0efd392b91a33e54c0e218b
Alg........RS256
Key Type...RSA
Use........sig

主类的 pom.xml 提取。

<dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>3.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-security-sso-oidc</artifactId>
            <version>3.3.5</version>
        </dependency>
    </dependencies>

但是,相同的代码在 Tomee 8 中部署时不起作用。

@WebServlet(name = "NewServlet", urlPatterns = {"/x"})
public class NewServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter writer = response.getWriter();

        final WebClient client = WebClient.create("https://www.googleapis.com/oauth2/v3/certs", Arrays.asList(new JsonWebKeysProvider()), true).accept(MediaType.APPLICATION_JSON);
        JsonWebKeys keys = client.get(JsonWebKeys.class);
        keys.getKeys().forEach(key -> {
            writer.println("****************************************************************************");
            writer.println("ID........." + key.getKeyId());
            writer.println("Alg........" + key.getAlgorithm());
            writer.println("Key Type..." + key.getKeyType());
            writer.println("Use........" + key.getPublicKeyUse());
        });

    }
}

此代码在 Tomee 8 中运行时,ID、算法、密钥类型和用途为空。我已添加 cxf oidc lib 并且 jose jar 安装在 tomee/lib 文件夹中。

示例输出:

****************************************************************************
ID.........null
Alg........null
Key Type...null
Use........null
****************************************************************************
ID.........null
Alg........null
Key Type...null
Use........null

为 servlet 提取 pom.xml。

<dependencies>
    <dependency>
        <groupId>org.apache.tomee</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0-3</version>
        <scope>provided</scope>
    </dependency>      
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>${cxf.version}</version>
        <scope>provided</scope>
    </dependency> 
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-security-sso-oidc</artifactId>
        <version>${cxf.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>${cxf.version}</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

是什么导致了这个问题?

【问题讨论】:

    标签: cxf apache-tomee cxf-client tomee-8


    【解决方案1】:

    我意识到,当在 tomee 中创建 Webclient 时,它会获取 tomee 提供的总线属性,这导致 JsonWebKeysProvider 不被调用。

    在我的例子中,下面是在 tomee 中创建客户端的正确方法。

    JAXRSClientFactoryBean sf = new JAXRSClientFactoryBean();
    sf.setAddress("https://www.googleapis.com/oauth2/v3/certs");
    sf.setProvider(new JsonWebKeysProvider());
    sf.setBus(new ExtensionManagerBus());
    

    调用 sf.setBus(new ExtensionManagerBus()); 确保不拾取 tomee 提供的值/属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2012-02-19
      • 2019-12-29
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      相关资源
      最近更新 更多