2017-11-03 4 views
0

Java 응용 프로그램을 통해 keycloak 서버를 치고 있습니다. 매개 변수와 함께 우편 배달부 URL을 실행할 때 응답 토큰을 받고 있지만 자바를 통해 동일한 작업을 수행하려고하면 오류가 발생합니다. 다음은 내 코드입니다 : 나는 줄 "con.getInputStream()"의 아래에 오류가서버가 HTTP 응답 코드를 반환했습니다 : 400 for Keycloak

public void login() { 
    try { 
    String uri = "http://localhost:7080/auth/realms/demo/protocol/openid-connect/token"; 
    URL url = new URL(uri); 
       HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

       con.setRequestMethod("POST"); 
       con.setRequestProperty("Content-Type", "application/json"); 
       con.setDoInput(true); 
       con.setDoOutput(true); 
       con.setReadTimeout(10000); 

       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       params.add(new BasicNameValuePair("grant_type", "password")); 
       params.add(new BasicNameValuePair("client_id", "SuperAdminPortal")); 
       params.add(new BasicNameValuePair("username", "admin")); 
       params.add(new BasicNameValuePair("password", "demo")); 

       OutputStream oss = con.getOutputStream(); 
       BufferedWriter writer = new BufferedWriter(
         new OutputStreamWriter(oss, "UTF-8")); 
       writer.write(getQuery(params)); 
       writer.flush(); 
       writer.close(); 
       oss.close(); 

       con.connect(); 
       con.getInputStream() 
    } 
catch (Exception ex) 
     {ex.printStackTrace();} 
} 


private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException 
{ 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 

    for (NameValuePair pair : params) 
    { 
     if (first) 
      first = false; 
     else 
      result.append("&"); 

     result.append(URLEncoder.encode(pair.getName(), "UTF-8")); 
     result.append("="); 
     result.append(URLEncoder.encode(pair.getValue(), "UTF-8")); 
    } 

    return result.toString(); 
} 

11:05:08,346 ERROR [stderr] (default task-6) java.io.IOException: Server returned HTTP response code: 400 for URL: http://localhost:7080/auth/realms/demo/protocol/openid-connect/token 

모든 정보는 감지 할 수있다.

답변

0

콘텐츠 유형을 application/x-www-form-urlencoded으로 변경해야합니다. RFC-6749 OAuth2을 참조하십시오.

con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
0

여전히 나에게 같은 오류가 표시되었습니다. 아래 코드를 작성하여이 문제를 해결했습니다.

String uri = "http://localhost:7080/auth/realms/demo/protocol/openid-connect/token"; 

      HttpClient client = HttpClientBuilder.create().build(); 
      HttpPost post = new HttpPost(uri); 
      post.setHeader("User-Agent", 
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); 
      List<BasicNameValuePair> urlParameters = new ArrayList<BasicNameValuePair>(); 
      urlParameters.add(new BasicNameValuePair("grant_type", "password")); 
      urlParameters.add(new BasicNameValuePair("client_id", "SuperAdminPortal")); 
      urlParameters.add(new BasicNameValuePair("username", useName)); 
      urlParameters.add(new BasicNameValuePair("password", password)); 
      post.setEntity(new UrlEncodedFormEntity(urlParameters)); 
      HttpResponse response = client.execute(post); 
      System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      StringBuffer result = new StringBuffer(); 
      String line1 = ""; 
      while ((line1 = rd.readLine()) != null) { 
       result.append(line1); 
      } 
      System.out.println(result); 
+0

예. POST 본문에서 매개 변수를 양식으로 보내야합니다. 그래서 post.setEntity (새로운 UrlEncodedFormEntity (urlParameters)); 트릭을하고있다. – Boomer

관련 문제