2016-11-10 4 views
3

Я создаю API для отдыха с использованием Spring Security Oauth2 для его защиты.Rest Api call дает ошибку 400 с использованием Spring Oauth2

Следующая локон команда запускает успешно и я получаю фишку:

curl -X POST -vu clientapp:123456 http://localhost:8080/dms-application-0.0.1-SNAPSHOT/oauth/token -H "Accept: application/json" -d "password=spring&username=roy&grant_type=password&scope=read%20write&client_secret=123456&client_id=clientapp" 

Следующий тест, чтобы получить маркер также работает успешно:

@Test 
public void getAccessToken() throws Exception { 
    String authorization = "Basic " + new String(Base64Utils.encode("clientapp:123456".getBytes())); 
    String contentType = MediaType.APPLICATION_JSON + ";charset=UTF-8"; 

    // @formatter:off 
    String content = mvc 
      .perform(
        post("/oauth/token") 
          .header("Authorization", authorization) 
          .contentType(
            MediaType.APPLICATION_FORM_URLENCODED) 
          .param("username", "roy") 
          .param("password", "spring") 
          .param("grant_type", "password") 
          .param("scope", "read write") 
          .param("client_id", "clientapp") 
          .param("client_secret", "123456")) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType(contentType)) 
      .andExpect(jsonPath("$.access_token", is(notNullValue()))) 
      .andExpect(jsonPath("$.token_type", is(equalTo("bearer")))) 
      .andExpect(jsonPath("$.refresh_token", is(notNullValue()))) 
      .andExpect(jsonPath("$.expires_in", is(greaterThan(4000)))) 
      .andExpect(jsonPath("$.scope", is(equalTo("read write")))) 
      .andReturn().getResponse().getContentAsString(); 

    // @formatter:on 

    String token= content.substring(17, 53); 
} 

Однако при вызове остального конечной точки снаружи от webapp с использованием Spring RestTemplate дает мне ошибку http 400. Под кодом:

@RequestMapping(value = "/authentication", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity authenticate(@RequestBody CredentialsDto credentials) { 
    try { 

     String email = credentials.getEmail(); 
     String password = credentials.getPassword(); 
     String tokenUrl = "http://" + env.getProperty("server.host") + ":8080" + "/dms-application-0.0.1-SNAPSHOT" + "/oauth/token"; 

     // create request body 
     JSONObject request = new JSONObject(); 
     request.put("username", "roy"); 
     request.put("password", "spring"); 
     request.put("grant_type","password"); 
     request.put("scope","read write"); 
     request.put("client_secret","123456"); 
     request.put("client_id","clientapp"); 


     // set headers 
     HttpHeaders headers = new HttpHeaders(); 

     String authorization = "Basic " + new String(Base64Utils.encode("clientapp:123456".getBytes())); 
     String contentType = MediaType.APPLICATION_FORM_URLENCODED.toString(); 
     headers.set("Authorization",authorization); 
     headers.set("Accept","application/json"); 
     headers.set("Content-Type",contentType); 

     HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers); 

     // send request and parse result 
     ResponseEntity<String> loginResponse = restClient.exchange(tokenUrl, HttpMethod.POST, entity, String.class); 
     // restClient.postForEntity(tokenUrl,entity,String.class,) 
     if (loginResponse.getStatusCode() == HttpStatus.OK) { 
      //JSONObject userJson = new JSONObject(loginResponse.getBody()); 
      String response = loginResponse.getBody(); 
      return ResponseEntity.ok(response); 
     } else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) { 
      // nono... bad credentials 
      return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); 
    } 
    return null; 
} 

И Я получаю ошибку:

«недостающее тип гранта»

Любые идеи, что может быть неправильным или любые другие способы сделать это? Потому что я полностью застрял на этом.

Спасибо

+0

Попробуйте изменить этот 'headers.set ("Accept", "приложения/JSON"),' 'в headers.setAccept (Arrays.asList (MediaType.APPLICATION_JSON));'. Это правильный способ установки accept accept –

+0

400 ответ означает, что данные, отправляемые в тело запроса, являются синтаксически неправильными. Вы должны проверить json, который вы отправляете в тело запроса. Вы также можете протестировать его с помощью нового объекта ObjectMapper(). ReadValue ('JSONDATA', Class.class) в основном методе тестирования, если он получает десериализацию –

ответ

4

Попробуйте сделать это следующим образом:

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
map.add("username", "roy"); 
map.add("password", "spring"); 
map.add("grant_type", "password"); 
map.add("scope", "read write"); 
map.add("client_secret","123456"); 
map.add("client_id","clientapp");   

HttpEntity request = new HttpEntity(map, headers); 

Еще одна вещь, когда вы просите знак убедитесь, что не отправить запрос JSON, но с этим заголовком:

headers.add("Content-Type", "application/x-www-form-urlencoded"); 
Смежные вопросы