如何使用 Apache Camel 路由从授权服务器获取访问令牌?

Jav*_*Ops 5 java apache-camel

我有一个授权服务器 [用@SpringBootApplication@RestController@Configuration@EnableAuthorizationServeroauth2 安全性注释的简单类] 在端口上运行,8081该服务器工作正常,并在使用方法从 POSTMAN 请求时提供访问令牌POST以及键值对形式的所需参数, http://localhost:8080/oauth/token但是应该如何我在java中实现了camel路由,通过在body中传递参数来获取访问令牌?

Bed*_*dla 2

这个问题更多的是关于multipart/form-data使用 Apache Camel 发送。我前段时间正在玩它,并使用自定义处理器解决了它,将标头转换multipart/form-dataContent-Disposition: form-data.

这是我的处理器将标头转换为multipart/form-data格式:

public class PrepareMultipartFormData implements Processor {
    private String[] multipartHeaders;

    public PrepareMultipartFormData(String... multipartHeaders) {
        this.multipartHeaders = multipartHeaders;
    }

    @Override
    public void process(Exchange exchange) throws Exception {
        addMultipart(exchange.getIn(), multipartHeaders);
    }

    private static void addMultipart(Message message, String... multipartKeys){
        final String boundary = "---------------------------"+RandomStringUtils.randomAlphanumeric(9);
        message.setHeader(Exchange.CONTENT_TYPE, "multipart/form-data;boundary="+boundary);
        StringBuilder sb = new StringBuilder("--").append(boundary);

        for (String key: multipartKeys) {
                    sb.append("\r\n")
                    .append("Content-Disposition: form-data; name=\"").append(key).append("\"")
                    .append("\r\n\r\n")
                    .append(message.getHeader(key, String.class))
                    .append("\r\n")
                    .append("--").append(boundary);
        }
        message.setBody(sb.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

对于 OAuth 请求令牌,您需要发送:

  • HTTP 标头
    • 授权标头 - 这是由端点选项指定的标准HTTP 组件authUsername的一部分,authPassword
    • 内容类型 - 这是添加到我的PrepareMultipartFormData处理器中的
  • 表单数据- 这些数据是从PrepareMultipartFormData处理器 中的标头转换而来的
    • 授予类型
    • 用户名
    • 密码
    • 客户ID

最终路由可以这样实现:(
用一些表达式替换常量,以动态设置它。如果您只需要token响应,请添加一些解组,因为该路由返回 JSON)

from("direct:getTokenResponse")
        .setHeader(Exchange.HTTP_METHOD, constant("POST"))
        .setHeader(Exchange.HTTP_PATH, constant("oauth/token"))
        .setHeader("grant_type", constant("password"))
        .setHeader("username", constant("admin"))
        .setHeader("password", constant("admin1234"))
        .setHeader("client_id", constant("spring-security-oauth2-read-write-client"))
        .process(new PrepareMultipartFormData("grant_type", "username", "password", "client_id"))
        .to("http://localhost:8080?authMethod=Basic&authUsername=oauth-endpoint-username&authPassword=oauth-endpoint-password")
        .convertBodyTo(String.class)
        .to("log:response");
Run Code Online (Sandbox Code Playgroud)

PrepareMultipartFormData#addMultipart更新答案以提供使用MultipartEntityBuilder的更短的实现。

private static void addMultipart(Message message, String... multipartKeys) throws Exception{
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    for (String key: multipartKeys) {
        builder.addTextBody(key, message.getHeader(key, String.class));
    }
    HttpEntity resultEntity = builder.build();
    message.setHeader(Exchange.CONTENT_TYPE, resultEntity.getContentType().getValue());
    message.setBody(resultEntity.getContent());
}
Run Code Online (Sandbox Code Playgroud)