Неверный запрос при тестировании RestTemplate - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема в том, что когда я тестирую мое тестовое приложение с maven, оно говорит: 400 Bad Request.Я использую oauth2 с базовой аутентификацией и grant_type password.Если я делаю аутентификацию с такими программами, как Почтальон.Оно работает.Но если я добавляю Basic-Authetification с Http-заголовками, я получаю неверный запрос.

Я пытался удалить объект HttpHeaders() из HttpEntity, тогда я получаю 401 Unauthorized.Я пытался поместить зашифрованные заголовки вручную в объект HttpHeaders(), но это тоже дает мне 400 Bad Request.Если я выполняю запрос с Postman, выбираю POST в качестве метода и Basic Auth в качестве аутентификации с username, password, grant_type в качестве тела (JSON), это работает.

Так что это мой открытый класс тестирования @SpringBootTestTestAppApplicationTests {

    private RestTemplate restTemplate = new RestTemplate();


    @Test
    public void testOauthToken(){

        String plainCreds = "client:topsecret";
        byte[] plainCredsBytes = plainCreds.getBytes();
        byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
        String base64Creds = new String(base64CredsBytes);

        Object oauthRequest = new OauthRequest("Lukas", "test123", "password");

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic "+ base64Creds);
        HttpEntity<Object> reqData = new HttpEntity<>(oauthRequest, headers);

        ResponseEntity<Object> entity  = restTemplate.exchange("http://localhost:8080/oauth/token", HttpMethod.POST,
            reqData,
            Object.class);

    }


}

Это мой OauthRequest класс

@Data
public class OauthRequest {
    private String username;
    private String password;
    private String grant_type;

    public OauthRequest(String username, String password, String grant_type){
        this.username = username;
        this.password = password;
        this.grant_type = grant_type;
    }
}

Я хочу получить access_token и refresh_token с сервера.

Редактировать: у меня есть не работающий репозиторий здесь, если вы хотите узнать больше о коде: https://github.com/precodeeu/test-spring-oauth

Edit²: если я добавлю в него необработанную строку json, она тоже не будет работать.

    OauthRequest oauthRequest = new OauthRequest("Lukas", "test123", "password");
    String json;

    try {
        json = mapper.writeValueAsString(oauthRequest);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Basic " + base64Creds);
        headers.add("Content-Type", "application/json");
        HttpEntity<Object> reqData = new HttpEntity<>(json, headers);

        ResponseEntity<Object> entity = restTemplate.exchange("http://localhost:8080/oauth/token", HttpMethod.POST,
                reqData,
                Object.class);

    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }

Edit³ Я только что заметил, что тип содержимого должен быть Application_form_urlencoded

Решение: я обновил код и создал Stringbuilder

@ SpringBootTest открытый класс TestAppApplicationTests {

private RestTemplate restTemplate = new RestTemplate();


private String UrlEncodedBuilder(List<String[]> list){
    String returnString = "";
    for(String[] param : list){
        returnString+=param[0]+"="+param[1]+"&";
    }

    return returnString;
}

@Test
public void testOauthToken() {

    String plainCreds = "client:topsecret";
    byte[] plainCredsBytes = plainCreds.getBytes();
    byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
    String base64Creds = new String(base64CredsBytes);

    List<String[]> formData = new ArrayList();

    formData.add(new String[]{"username", "Lukas"});
    formData.add(new String[]{"password", "test123"});
    formData.add(new String[]{"grant_type", "password"});

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    headers.add("Authorization", "Basic " + base64Creds);
    HttpEntity<Object> reqData = new HttpEntity<>(UrlEncodedBuilder(formData), headers);

    ResponseEntity<Object> entity = restTemplate.exchange("http://localhost:8080/oauth/token", HttpMethod.POST,
            reqData,
            Object.class);


}
}

1 Ответ

0 голосов
/ 19 февраля 2019

Прежде всего, выясните, как именно выглядит ваш запрос, и сравните его с тем, который работает.Также проверьте тело ответа в случае кода 400, тело может содержать некоторые подсказки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...