2017-11-03 18 views
0

私は、Javaアプリケーションを通じてkeycloakサーバーにヒットしています。私はパラメータと一緒に郵便番号の上でURLを実行すると、私は応答トークンを取得していますが、私はjavaを介して同じことをしようとすると、それはエラーを投げている。以下は私のコードです:私はライン "con.getInputStream()" に以下のエラーが出ますサーバーからHTTP応答コード:400が返されました。キークローキング

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

関連する問題