oauth2 интеграционный тест с пружинной загрузкой - PullRequest
0 голосов
/ 11 апреля 2020

У меня проблемы с написанием интеграционных тестов для моего приложения. Ручное тестирование интеграции работает отлично, как и ожидалось; просто возникли проблемы при написании интеграционного теста. Я следовал руководству от https://www.baeldung.com/oauth-api-testing-with-spring-mvc, но оно не работает в моем приложении. (не уверен, что это потому, что я использую JUnit5). Я действительно не знаю, что именно мне не хватает. В конце запрос продолжает отвечать запретом 401 вместо 200 на почтовый запрос для установки нового токена доступа.

application.yml

spring:
  profiles: test
security:
  oauth:
    client:
      client-id: client-id
      client-secret: client-secret

IntegrationTest

@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class MyIntegrationTest {

    private MockMvc mvc;

    @Autowired
    private FilterChainProxy filterChainProxy;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Value("${security.oauth2.client.client-id}")
    private String clientId;

    @Value("${security.oauth2.client.client-secret}")
    private String clientSecret;

    @BeforeEach
    public void setUp() {
        mvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .addFilter(filterChainProxy).build();
    }

    private String obtainAccessToken() throws Exception {
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "client_credentials");
        params.add("client_id", clientId);
        params.add("client_secret", clientSecret);
        params.add("scope", "any");

        String mvcResult = mvc.perform(post("/oauth/token")
            .params(params)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON))
            .andReturn()
            .getResponse().getContentAsString();

        return new JacksonJsonParser().parseMap(mvcResult).get("access_token").toString();
    }


}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Чего на самом деле не хватает, так это авторизации клиента. Необходимо добавить заголовки авторизации.

private String obtainAccessToken() throws Exception {
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "client_credentials");
        params.add("scope", "any");

        String mvcResult = mvc.perform(post("/oauth/token")
            .params(params)
             // including authorization headers
            .headers("Authorization", "Basic " + new String(Base64Utils.encode((clientId + ":" + clientSecret).getBytes()))))
            .accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
            .andReturn()
            .getResponse().getContentAsString();

        return new JacksonJsonParser().parseMap(mvcResult).get("access_token").toString();
    }
0 голосов
/ 11 апреля 2020

Вам нужно изменить это:

MediaType.APPLICATION_JSON

на это:

MediaType.APPLICATION_JSON_UTF8_VALUE

или это, как в примере:

"application/json;charset=UTF-8"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...