Spring: заполнить форму OAuth2, не открывая браузер

#java #spring #spring-boot #spring-mvc

#java #spring #spring-загрузка #spring-mvc

Вопрос:

У меня есть приложение OAuth2. Чтобы протестировать серверную службу, я хотел бы, чтобы тестируемый пользователь вошел в систему программно и затем запросил API, подтвердив ответ.

Другими словами, я пытаюсь выполнить следующее (apache http), но с Spring:

     HttpPost httpPost = new HttpPost(
            "https://foo/authsvc?PolicyId=urn:bar:security:authentication:asf:nidloginamp;Target=https://foo/mga/sps/auth");
    java.util.List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    nvps.add(new BasicNameValuePair("username", "john"));
    nvps.add(new BasicNameValuePair("password", "doe"));
    nvps.add(new BasicNameValuePair("operation", "verify"));

    httpPost.setEntity(new UrlEncodedFormEntity(nvps));

    response = httpClient.execute(httpPost);
  

Вопрос

Как это можно сделать с помощью Spring?

Редактировать

Я не хочу издеваться над аутентификацией OAuth.

После OAuth некоторые учетные записи необходимо выбрать программно (флажок), а также нажать кнопку отправки, это по-прежнему, не открывая браузер.

Комментарии:

1. Итак, вы хотите автоматизировать свои интерфейсные тесты? Если это так, вам следует проверить selenium ( seleniumhq.org ). Хотя также было бы возможно изменить поток входа в систему для тестов, как предложил Мэтт, я не думаю, что это предпочтительнее, поскольку вы должны включить рабочий процесс аутентификации в тесты.

2. @BeWu благодарит за предложение. Я знаком с такими инструментами, как Selenium, Proractor и т.д. Но идея здесь заключается в модульном тестировании внутреннего API: прозрачный вход в систему, затем запрос к API и утверждение ответа. Прояснил вопрос. Извините за путаницу

3. Если вы используете предоставление кода аутентификации и хотите продолжать использовать его для тестов, вам понадобится, чтобы кто-то вводил пароль, будь то человек или инструмент. Единственный другой известный мне способ — использовать неявное предоставление, как предложил Мэтт.

4. @BeWu Я могу сделать это успешно (войдите в систему, установите флажок после входа в систему и отправьте форму) с помощью Apache HTTP. Затем я получаю токен обратно с сервера OAuth, который я могу использовать для вызова внутреннего API, который я хочу протестировать. Я просто пытаюсь сделать то же самое с Spring. Итак, я надеюсь, что Spring предложит способ сделать это также

Ответ №1:

Вы могли бы использовать поток паролей для тестирования. Для этого потока не требуется браузер. Смотрите: OAuth RFC.

Пример:

  POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=passwordamp;username=johndoeamp;password=A3ddj3w
  

Редактировать:

Если вы хотите протестировать свой процесс входа в систему, вы могли бы использовать MockMvc. (https://spring.io/guides/gs/testing-web )

Пример:

 @Before
public final void init() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            .apply(SecurityMockMvcConfigurers.springSecurity())
            .build();
}

@Test
public void test() throws Exception {
    ...

    MvcResult result = mockMvc.perform(
            post("/login")
                    .content(...)
            )
            .andExpect(status().isOk())
            .andReturn();

    MockHttpServletResponse response = result.getResponse();

    ...
}
  

Комментарии:

1. Спасибо. Я должен прояснить вопрос. Я не ищу RFC, но как его реализовать 🙂

2. Я расширил свой ответ. (Однако, на мой взгляд, использование потока паролей для всех других тестов конечных точек по-прежнему уместно.)

3. Спасибо за редактирование. К сожалению, имитация аутентификации не предоставит мне токен, который мне нужен для внутреннего API. Итак, в моем случае использования я не могу издеваться. Здесь я пытаюсь протестировать не уровень OAuth, а серверную часть.