【问题标题】:Authenticator response code 400身份验证器响应代码 400
【发布时间】:2014-06-26 03:18:31
【问题描述】:

我尝试使用HttpsURLConnection 访问我的服务器,得到响应代码 401 - 需要进行身份验证。尝试了以下方法:

            Authenticator.setDefault (new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication ("myuser", "!mypassword".toCharArray());
                }
            });

得到响应代码 400 - 错误请求。

基于一些 stackoverflow 研究,我也尝试使用:

        String authorizationString = "Basic " + Base64.encodeToString(("username" + ":" + "password").getBytes(), Base64.DEFAULT);
        conn.setRequestProperty("Authorization", authorizationString);

同样的问题,代码 400。我也信任在这篇文章中使用 @Chrispix 方法的所有主机: Trust Anchor not found for Android SSL Connection 不确定这是否会以某种方式干扰,但这是针对原型的,并且站点证书无效,因此我需要绕过检查。

使用这些属性建立连接,不确定是否有任何错误或缺失:

        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.addRequestProperty("Content-Type", "application/json");
        conn.setRequestMethod("POST");
        conn.setDoInput(true);

谢谢!

【问题讨论】:

  • 你能把 Base64.DEFAULT 改成 Base64.NO_WRAP 吗?你还需要setRequestProperty("Authorization", "Basic " + encoding);
  • 试过no_wrap没有效果:(
  • 尝试使用邮递员客户端,您可以使用上面定义的属性检查上面的 url,如内容类型或请求类型(get/post)
  • 试试 Base64.DEFAULT 到 Base64.URL_SAFE|Base64.NO_WRAP

标签: android httpurlconnection httpsurlconnection


【解决方案1】:

使用HttpClient 怎么样?

HttpClient httpClient= new DefaultHttpClient();
HttpGet httpGet= new HttpGet(yourUrl);
String authString = (yourUserName+":"+yourPassword);
httpGet.addHeader("Authorization", "Basic " + 
    Base64.encodeToString(authString.getBytes(),Base64.DEFAULT));
HttpResponse response = httpClient.execute(httpGet);

目前看来您想绕过证书检查,此相关链接可能会对您有所帮助

Trusting all certificates using HttpClient over HTTPS

【讨论】:

  • 到底为什么要通过 http 发送身份验证详细信息?
【解决方案2】:

试试这个方法

public String sendHttpRequest(String params)
{       
    URL url;
    String result = new String();
    try 
    {
        url = new URL(AUTHENTICATION_SERVER_ADDRESS);
        HttpURLConnection connection;
        connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded;charset=UTF-8");
        PrintWriter out = new PrintWriter(connection.getOutputStream());

        out.println(params);
        out.close();

        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                        connection.getInputStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            result = result.concat(inputLine);  

        }
        in.close();         
    } 
    catch (MalformedURLException e) {
        e.printStackTrace();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }           

    if (result.length() == 0) {
        result = HTTP_REQUEST_FAILED;
    }

    return result;


}

params 参数应该是这种格式

      public String authenticateUser(String username, String password) 
      {
           String params = "username="+ URLEncoder.encode(username,"UTF-8") +
                           "&password="+ URLEncoder.encode(password,"UTF-8") +
                    "&";

          String result = socketOperator.sendHttpRequest(params);       

          return result;
       }

调用此函数进行身份验证...

【讨论】:

    【解决方案3】:

    似乎我得到了正确的响应——我认为 400 表示请求格式错误,但检查错误流我发现请求很好,但参数错误。菜鸟失误!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多