【问题标题】:How to get access token from Authorisation Server using Apache Camel routes?如何使用 Apache Camel 路由从授权服务器获取访问令牌?
【发布时间】:2018-05-06 06:01:53
【问题描述】:

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

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    这个问题更多的是关于使用 Apache Camel 发送multipart/form-data。前段时间我在玩它,并使用自定义处理器解决了它,使用Content-Disposition: form-data 将标头转换为multipart/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());
        }
    }
    

    您需要发送到 OAuth 请求令牌:

    • HTTP 标头
      • 授权标头 - 这是标准HTTP component 的一部分,由端点选项authUsername 和authPassword 指定
      • Content-Type - 这是在我的PrepareMultipartFormData 处理器中添加的
    • 表单数据 - 这些是从 PrepareMultipartFormData 处理器中的标题转换而来的
      • grant_type
      • 用户名
      • 密码
      • client_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");
    

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

    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());
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 2020-02-05
      • 2018-06-13
      • 2015-05-04
      • 2017-01-08
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多