Как получить токен доступа с Сервера авторизации по маршрутам Apache Camel? - PullRequest
0 голосов
/ 06 мая 2018

У меня есть сервер авторизации [Простой класс с пометкой @SpringBootApplication, @RestController, @Configuration, @EnableAuthorizationServer & oauth2 security], работающий на порту 8081, который отлично работает и предоставляет токен доступа при запросе от POSTMAN с использованием метода POST вместе с необходимыми параметрами в виде пары ключ-значение, http://localhost:8080/oauth/token, но как мне реализовать верблюжий маршрут в Java, чтобы получить токен доступа, передав параметры в теле?

1 Ответ

0 голосов
/ 06 мая 2018

Этот вопрос больше касается отправки multipart/form-data с Apache Camel. Я играл с ним некоторое время назад и решил его с помощью собственного процессора, преобразовав заголовки в формат multipart/form-data с Content-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());
    }
}

На токен запроса OAuth необходимо отправить:

  • HTTP-заголовки
    • Заголовок авторизации - это часть стандартного компонента HTTP , указанного в параметрах конечной точки 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");

Обновление ответа для обеспечения более короткой реализации 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...