【问题标题】:Server returned HTTP response code: 400 for Keycloak服务器返回 HTTP 响应代码:Keycloak 的 400
【发布时间】:2017-11-03 05:56:30
【问题描述】:

我正在通过 java 应用程序访问 keycloak 服务器。当我在邮递员上运行 url 和参数时,我得到了响应令牌,但是当我尝试通过 java 做同样的事情时,它会抛出错误。以下是我的代码:

    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();
}

我在“con.getInputStream()”行中收到以下错误

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

任何信息都是可感知的。

【问题讨论】:

    标签: java post http-post httpurlconnection keycloak


    【解决方案1】:

    您必须将内容类型更改为application/x-www-form-urlencoded。 见RFC-6749 OAuth2

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

    【讨论】:

      【解决方案2】:

      它仍然向我显示相同的错误。我通过编写以下代码解决了这个问题:

      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);
      

      【讨论】:

      • 是的。您必须在 POST 正文中以表单形式发送参数。所以 post.setEntity(new UrlEncodedFormEntity(urlParameters));成功了。
      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多