验证错误:无法对任何的应对这些挑战:{}的Android - 401未授权(Authentica

2019-07-30 20:49发布

验证错误:无法对任何的应对这些挑战:{}的Android - 401未授权

我从这个链接引用采取在Android上使用与DefaultHttpClient HttpPost时验证错误

我的工作在Drupal中支持Android应用程序。 JSON格式的Web服务 - 在我从Android应用程序将数据发送到Drupal的网站。 现在我可以读Drupal的Web服务JSON数据,在我的Android应用程序写它。 但是,在从机器人的Drupal写面临的问题,它产生响应的状态代码:

401未授权

从Android原生的应用程序会生成401,而从PhoneGap的,从机器人,当我发起AJAX请求它​​完美的作品与写在Drupal的网站上的文章或网页。 这样就意味着Web服务的工作完美&

我PhoneGap的Android应用程序完美的作品有一个与我正在我上的Android2.3.4 Android应用Android原生JAVA应用问题 - >三星Galaxy S加 - 三星GT-I9001

这是我对Java的Android代码。

==============================

String url = "XXX";
strResponse1 = makeWebForPostIdea(url,title,body);

public static String makeWebForPostIdea(String url, String title,String body)
    {
        JSONStringer jsonobject = null;
        JSONObject json = null;
        JSONObject jsonnode = null;

        DefaultHttpClient client = new DefaultHttpClient();

Credentials creds = new UsernamePasswordCredentials("username", "password");
        client.getCredentialsProvider().setCredentials(new       AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), creds);
 HttpPost post = new HttpPost(url);
System.out.println("value of the post =============> "+post);
 try {
            JSONObject jsonvalue = new JSONObject();
            jsonvalue.put("value", body.toString());

            JSONArray array = new JSONArray();
            array.put(jsonvalue);

            jsonnode = new JSONObject();
            jsonnode.put("und", array);

            System.out.println("@@@@@@2    jsonnode=======>"+jsonnode.toString());


        } catch (JSONException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
 try {
 jsonobject = new JSONStringer().array().object().key("und").object().key("0").object().key("value").value(body).endObject().endObject().endObject().endArray();
    System.out.println("=============>"+jsonobject);

        } catch (JSONException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

         List<NameValuePair> params = new ArrayList<NameValuePair>();

                 params.add(new BasicNameValuePair("type","page"));

            params.add(new BasicNameValuePair("title",title));
            params.add(new BasicNameValuePair("language","und"));
            params.add(new BasicNameValuePair("body",jsonobject.toString()));

            System.out.println("value of the params =============> "+params);

        UrlEncodedFormEntity formEntity = null;
        try {
                formEntity = new UrlEncodedFormEntity(params);
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        post.setEntity(formEntity);

        try {

            HttpResponse response = client.execute(post);

            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println("=========> statusCode post idea=====> "+statusCode);    
            if (statusCode == HttpStatus.SC_OK)
            {
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                return iStream_to_String(is);
            }
            else
            {
                return "Hello This is status ==> :"+String.valueOf(statusCode);
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

     public static String iStream_to_String(InputStream is1) {
            BufferedReader rd = new BufferedReader(new InputStreamReader(is1), 4096);
            String line;
            StringBuilder sb = new StringBuilder();
            try {
                while ((line = rd.readLine()) != null) {
                    sb.append(line);
                }
                rd.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String contentOfMyInputStream = sb.toString();
        return contentOfMyInputStream;
            }

    }

   }

这里要说的是我收到的logcat。

 08-09 12:41:29.063: I/System.out(336): value of the post =============>      org.apache.http.client.methods.HttpPost@4053c3c8
 08-09 12:41:29.093: I/System.out(336): @@@@@@2    jsonnode=======>{"und":  [{"value":"ddddddd"}]}
 08-09 12:41:29.093: I/System.out(336): =============>[{"und":{"0":{"value":"ddddddd"}}}]
 08-09 12:41:29.103: I/System.out(336): value of the params =============> [type=page, title=hhhh, language=und, body=[{"und":{"0":{"value":"ddddddd"}}}]]
 08-09 12:41:30.913: W/DefaultRequestDirector(336): Authentication error: Unable to respond to any of these challenges: {}
 08-09 12:41:30.913: I/System.out(336): =========> statusCode post idea=====> 401
 08-09 12:41:30.924: I/System.out(336): =========> Response from post  idea => Hello This is status ==> :401

下面是它完美的作品我PhoneGap的Ajax请求。

$('#page_node_create_submit').live('click',function(){

  var title = $('#page_node_title').val();
  //if (!title) { alert('Please enter a title.'); return false; }

  var body = $('#page_node_body').val();
  //if (!body) { alert('Please enter a body.'); return false; }

  // BEGIN: drupal services node create login (warning: don't use https if you don't     have ssl setup)
  $.ajax({
      url: "XXX",
      type: 'post',
      data: 'node[type]=page&node[title]=' + encodeURIComponent(title) +  '&node[language]=und&node[body][und][0][value]=' + encodeURIComponent(body),
      dataType: 'json',
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('page_node_create_submit - failed to login');
        console.log(JSON.stringify(XMLHttpRequest));
        console.log(JSON.stringify(textStatus));
        console.log(JSON.stringify(errorThrown));
      },
      success: function (data) {
      $.mobile.changePage("index.html", "slideup");
     }
  });
  // END: drupal services node create

  return false;

});

================================================== ===============================

编辑:

我已经尝试了Apache的HttpClient的各种方法对我error.During这个时候,我做了一些调查和搜索谷歌和发现了一些有趣的东西。

第1件事,我发现它是谷歌Android官方不建议的Apache HttpClient的,我用我的代码。 检查此链接。 在从杰西·威尔逊在Dalvik队链路消息。 在他们建议使用HttpURLConnection的,而不是DefaultHttpClient也撰文指出,Android团队将不再开发的Apache的HttpClient。 所以,我使用它的旧版本。

http://android-developers.blogspot.in/2011/09/androids-http-clients.html

我发现这种形式的链接第二件事。 这表明,Android是与Apache的HttpClient的4.0 Beta2中,其中有一个缺陷,当它涉及到基本身份验证出货。 我使用的身份验证方法是3.X的HttpClient的,我从这个链接发现。 检查链接。 http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

因此,版本问题。

http://dlinsin.blogspot.in/2009/08/http-basic-authentication-with-android.html

我也发现这个问题的潜在解决方案的链接。

http://ogrelab.ikratko.com/using-newer-version-of-httpclient-like-4-1-x/

阿帕奇的HttpClient 4.1在Android

什么版本的Apache HTTP客户端采用的是Android 1.6捆绑?

从这些链接,我做了一个结论,即如果我们升级了Apache的HttpClient到最新的稳定版本,那么这个问题就可以解决了。

但是,这是直接没有可能的,由于Android团队已经正式停止了Apache HttpClient的支持。

有了这个链接,便有可能解决。 我还没有尝试过,但我的工作就可以了。

它是一个可以在Android的升级版本的HttpClient帮助库。

http://code.google.com/p/httpclientandroidlib/

另一种解决方案可以使用HttpURLConnection的 。我自己也是努力。

但这里的计算器和互联网的大多数人似乎使用DefaultHttpCLient与Android。 和ofcourse它也与我的工作在我的应用程序,包括登录,注册,从服务器和会话等functionality.Just阅读它不与工作直接发布一些文章到我的服务器的Drupal网站。 它与服务器上的用户注册过程中POST请求完美的作品。

因此,朋友们,有什么建议对此? 为什么它不工作只是张贴文章?

Answer 1:

为什么它的工作原理与PhoneGap的,但不是Java。 PhoneGap的运行在Web容器的应用程序,因此已经被验证 - 你拥有所有正确的饼干。 AJAX将分享一切“只是工作”同一个会话。

不过了HTTPClient是一个完全不同的 - 你正在发起一个全新的HTTP会话,一切都必须是正确的。

关于HTTP认证是如何工作的几点意见:

有几种HTTP认证方法 - 这是该选择哪个Web服务器。 在进一步讨论之前,请检查您的Drupal的配置制定出它是否是:

  • 基本认证(用户名和密码)。 每个人都和他们的狗支持这一点,但它是非常不安全的。 见http://en.wikipedia.org/wiki/Basic_access_authentication了解更多详情
  • 摘要(用户名和质询/响应散列使用MD5,这是更安全,但要复杂得多。需要注意的是MD5被普遍认为是弱了。许多图书馆支持,包括Apache,见http://en.wikipedia.org/wiki/ Digest_access_authentication了解更多详情
  • NTLM其上实现的IIS(Kerberos的/ SPEGNO的变体)。 这不是一般从Java支持,但确实的HTTPClient自称 - 但使用不同的凭据对象。 见http://hc.apache.org/httpclient-3.x/authentication.html#NTLM

(另请注意,Web容器具有“智慧”,能够尝试不同的认证方法由服务器的要求,所有在幕后)

同时检查Drupal的网络日志。 几个要点:

  • 你看到HttpClient的连接都没有 。 并且是URL将正确的资源。 从服务器的角度总是值得一试...
  • 它是否到正确的服务器? 你在对多穴Web服务器的URL中使用的IP地址,所以请求转到错误的服务器:什么可能出问题的一个例子吗?
  • 检查通过先发制人的客户端发送的验证是正确的类型(基本,摘要,NTLM)

让我知道,如果这有助于。 如果没有,你可以提供更多的细节按照这个帖子,我可以有更多的建议跟进。



Answer 2:

你可以尝试检查: 如何使用Apache的HttpClient与Web认证做HTTP POST?

它采用了HttpInterceptor需要时注入的认证数据,



Answer 3:

我建议,以测试第一PHP端出来的应用程序。 有几种方法,使自己的呼叫,包括头部和权威性。 从卷曲GraphicalHttpClient(http://itunes.apple.com/us/app/graphicalhttpclient/id433095876?mt=12,我个人使用,它工作体面)。 还有一些其他的选项,如REST客户端调试器(https://addons.mozilla.org/en-US/firefox/addon/restclient/)

这样你就可以测试你的电话在许多方面是疼痛直接在客户端做的(有时它只是从http更改为https或授权头将你的令牌的类型和更容易被madeo n个飞)。

一旦一切正常,重现您的客户端相同的呼叫,头和身体,你准备好去。



Answer 4:

我也陷入了同样的“DefaultRequestDirector:身份验证错误:无法对任何的应对这些挑战:{}”使用Drupal的服务问题循环J Android的异步HTTP库 (强烈推荐)。

为我解决的关键是在关于要特别注意从Drupal的输出JSON的答案之一何塞大号Ugia的评论。 我试图抓住一个JSONObject但真正的信息是数组形式“[”错误的用户名或密码。“]”。 切换到JSONArray正确抓住了错误,让我来处理它。 你的情况,我相信那是因为你没有张贴登录凭证,如Drupal的服务期待它。

你应该使用Drupal服务记住你应该做的系统/连接,并抢了会议,其次是用户/登录(与作为参数传入的用户名/密码)并获取会话,然后所有的后续请求应该工作。 这就是为什么我喜欢用循环J库,因为它使所有这些请求更易于管理。 这里是连接与循环J Drupal的一个非常基本的例子。 随后的所有职位都使用PARAMS容易。

public class Loopj {
  private static final String TAG = "loopj";

  private static AsyncHttpClient client = new AsyncHttpClient();
  private final PersistentCookieStore myCookieStore;


  public Loopj(Context context) {
    myCookieStore = new PersistentCookieStore(context);
    client.setCookieStore(myCookieStore);
    client.addHeader("Content-type", "application/json");
  }


  public void systemConnect(String uri) throws JSONException {
    client.post(uri + "/endpoint/system/connect", new JsonHttpResponseHandler() {
      @Override
      public void onSuccess(JSONObject json) {
        Log.i("TAG", "Connect success =" + json.toString());
      }

      @Override
      public void onFailure(Throwable e, String response) {
        Log.e("TAG", "Connect failure");
      }
    });
  }

  public void userLogin(String uri) throws JSONException {
    RequestParams params = new RequestParams();
    params.put("username", username);
    params.put("password", password);
    client.post(uri + "/endpoint/user/login", params, new JsonHttpResponseHandler() {
      @Override
      public void onSuccess(JSONArray response) {
        Log.i("TAG", "Login success =" + response.toString());
      }

      @Override
      public void onFailure(Throwable e, JSONArray json) {
        Log.e("TAG", "Login failure");
      }
    });
  }


文章来源: Authentication error: Unable to respond to any of these challenges: {} Android - 401 Unauthorized