У меня проблема в том, что когда я тестирую мое тестовое приложение с 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);
}
}