OAuth令牌请求-从响应实体获取access_token

use*_*804 5 java spring json oauth

public String requestAccessToken(String username, String password, String oauthaurl) {
    log.info("Request access token");
    String token = null;
    List<HttpMessageConverter<?>> converters = getMessageConverters();

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(converters);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap<String, String> oauthPayload = new LinkedMultiValueMap<String, String>();
    oauthPayload.add("username", username);
    oauthPayload.add("password", password);
    oauthPayload.add("grant_type", "password");

    HttpEntity<?> request = new HttpEntity<>(oauthPayload, headers);
    ResponseEntity<?> response = restTemplate.postForEntity(oauthaurl, request, Object.class);
    log.info(response.getStatusCode().toString());
    log.info(response.getBody().toString());

    JSONObject jsonObject = new JSONObject(response.getBody());
    log.info(jsonObject.toString());

    //get access_token from jsonObject here

    return token;

}
Run Code Online (Sandbox Code Playgroud)

我从令牌网址请求OAuth访问令牌的方法遇到麻烦。我实际上是从服务器获取带有access_token的响应,我在解析响应时遇到了麻烦。

log.info(response.getBody().toString());
Run Code Online (Sandbox Code Playgroud)

退货

{access_token=EI79TeB_Vavu-vgl5WLp8CNWpLUWQBpS3Cm4uU-C1VCJkQJFEo2SthMjPN4gmvQ9ZpQu6Iku11mnvZSUKPVim0MsAEpcMbBdIWl3AMiXCfv9OeqfJRK_1wwIyjo5brDeHK8L5XJPsg98mEKL41qg2IW0Ks9TeYbkRyw4CFKwjcuTi3W3toLBlEGOEinNnrrj6bhOjwaaCVT7zWAIVoImXa-h0VTsoCn2XRVoCO7GENV-Qx55JzTFPJhe2sg72HgRbN8kTID_AcsN8wSKRTQ3T0N74Ks8dfs3YRx0NP4-ADByMcMEnyP8IGoCPHwANNwA8JpYaL2pijWBjOm7VSA53B9Knqxv1EYajBFYXfy74jYUFqlGTKLRUtuKomJh_d9OHM04V-q7xgtlg9upB3s9ORXjbTmzRDzq9U4P67FGJdQe4D4WKUju7oNtjkDzbQZEp0A9fxyHxHFI7MRP4mwPuxMldgytX8Oc1SqoakFre7qzxldaitWqKqnt217e7N7G, token_type=bearer, expires_in=1209599, userName=xxx, .issued=Thu, 02 Mar 2017 16:03:08 GMT, .expires=Thu, 16 Mar 2017 16:03:08 GMT}
Run Code Online (Sandbox Code Playgroud)

我想做的就是将响应主体转换为JSONObject,这样我就可以将access_token作为String获取。

JSONObject jsonObject = new JSONObject(response.getBody());
log.info(jsonObject.toString());
Run Code Online (Sandbox Code Playgroud)

似乎不起作用-结果是

{}
Run Code Online (Sandbox Code Playgroud)

有人可以指出我正确的方向吗?谢谢!

编辑:

编码器-当我替换这些行时,我得到如下的堆栈跟踪

 2017-03-02 11:16:00.040  INFO 99914 --- [           main] c.u.e.service.EventRecor
 at [Source: java.io.PushbackInputStream@1a38c59b; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:60)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2922)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:237)
    ... 18 more
Run Code Online (Sandbox Code Playgroud)

编码器-尝试您的最新版本,我得到了此堆栈跟踪

2017-03-02 11:16:00.040  INFO 99914 --- [           main] c.u.e.service.EventRecor
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:628)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:549)
    at com.comp.eventrecorder.service.EventRecorderServiceImpl.requestAccessToken(EventRecorderServiceImpl.java:182)
    at com.comp.eventrecorder.service.EventRecorderServiceImpl.startProcessing(EventRecorderServiceImpl.java:57)
    at com.comp.eventrecorder.Application.main(Application.java:32)
    ... 8 more
Run Code Online (Sandbox Code Playgroud)

编码器-该请求来自邮递员fyi

在此处输入图片说明

Cod*_*der 5

注意:我可能会以错误的方式指出您。保留您的初始代码,然后尝试

JSONObject jsonObject = new JSONObject(response.getBody().toString());
log.info(jsonObject.getString("access_token"));
Run Code Online (Sandbox Code Playgroud)

初步答案:

问题似乎是您正在使用Object类检索响应实体。将其修改为字符串类,并让您进行如下调用:

ResponseEntity<String> response = restTemplate.postForEntity(oauthaurl, request, String.class);

JSONObject jsonObject = new JSONObject(response.getBody());

log.info(jsonObject.getString("access_token"));
Run Code Online (Sandbox Code Playgroud)

编辑

根据stacktrace,您可能不得不像使用MultiValueMapand 一样使用自定义实现LinkedMultiValueMap。而不是那样修改您的代码,如下所示。

public String requestAccessToken(String username, String password, String oauthaurl) {
    log.info("Request access token");
    String token = null;

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);



    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(oauthaurl)
                                                       .queryParam("grant_type", "password")
                                                       .queryParam("username", username)
                                                       .queryParam("password", password);

    URI myUri=builder.buildAndExpand().toUri();

    HttpEntity<?> request = new HttpEntity<>(headers);
    ResponseEntity<String> rs = restTemplate.exchange(myUri, HttpMethod.POST, request,String.class);
    JSONObject jsonObject = new JSONObject(rs.getBody());
    log.info(jsonObject.getString("access_token"));

    //get access_token from jsonObject here

    return token;

}
Run Code Online (Sandbox Code Playgroud)

让我知道您是否需要澄清!


Vik*_*ngh 0

JSONObject jsonObject = new JSONObject();
String tokens[]=response.getBody().toString().replace("}","").replace("{","").split(",");
for(String s:tokens){
  String split = s.split("=");
  jsonObject.put(split[0],split[1]);
}
Run Code Online (Sandbox Code Playgroud)