#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, а серверную часть.