身份验证错误:无法响应以下任何挑战:{} Android - 401 Unauthorized [英] Authentication error: Unable to respond to any of these challenges: {} Android - 401 Unauthorized

查看:36
本文介绍了身份验证错误:无法响应以下任何挑战:{} Android - 401 Unauthorized的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

身份验证错误:无法响应以下任何挑战:{} Android - 401 Unauthorized

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

我参考了这个链接在 Android 上使用 HttpPost 和 DefaultHttpClient 时出现身份验证错误

我正在开发以 Drupal 为支持的 Android 应用程序.因为我正在将数据从 android 应用程序发送到 drupal 网站 - JSON 格式的 webservice.现在我可以从 Drupal webservice 读取 JSON 数据并将其写入我的 android 应用程序中.但是在从android编写drupal时遇到问题,它会生成带有状态码的响应

I am working on android app in that backed in Drupal. In that I am sending data from android app to drupal website - webservice in JSON format. Now I can read JSON data from Drupal webservice and writing it in my android application. But facing problem in writing on drupal from android, it generates response with status code

401 未经授权

从android本机应用程序它生成 401 ,而从 phonegap-from android 当我发起 AJAX 请求时它完美地工作&在 drupal 网站上写一篇文章或页面.所以这意味着网络服务完美地工作&

From android native app it generates 401 , while from phonegap-from android when I initiate AJAX request it works perfectly & writes an article or page on drupal website. so that means webservice work perfectly &

我的 phonegap android 应用程序运行良好,Android 原生 JAVA 应用程序有问题我在 Android2.3.4 -> Samsung Galaxy 上运行我的 android 应用程序S Plus - 三星 GT-I9001

my phonegap android app works perfectly there is problem with Android native JAVA application I am running my android application on Android2.3.4 -> Samsung Galaxy S Plus - Samsung GT-I9001

这是我的 java android 代码.

here is my code for 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.

here is the logcat that I am getting.

 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 请求,它运行良好.

Here is my PhoneGap Ajax request it works perfectly.

$('#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 的各种方法.在这段时间里,我做了一些研究并在谷歌上搜索并发现了一些有趣的东西.

I have tried various methods for Apache httpclient for my error.During this time I have done some research and searched on google and found out some interesting stuff.

第一 我发现 Android-Google 正式不推荐我在代码中使用的 Apache HttpClient.检查此链接.在来自 Dalvik 团队的 Jesse Wilson 的链接消息中.他们建议使用 HttpURLConnection 而不是 DefaultHttpClient 并且还写道 Android 团队将不再开发 Apache httpclient .所以它是我使用的旧版本.

1st thing that I found it that Android-Google Officially does not recommend Apache HttpClient that I am using in my code. Check this link. In that Link message from Jesse Wilson from the Dalvik team. In that they suggest to use HttpURLConnection instead of DefaultHttpClient and also written that Android team will no longer develop Apache httpclient . so its the older version that I am using.

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

第二 我从这个链接中找到的东西.这表明 Android 随附 Apache 的 HttpClient 4.0 Beta2,在基本身份验证方面存在缺陷.我使用的身份验证方法是 HttpClient 3.x ,我已经发现从这个链接.检查链接.http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

2nd thing that I have found form this link. It suggests that Android is shipping with Apache's HttpClient 4.0 Beta2, which has a pitfall, when it comes to Basic Authentication. The Authentication method that I am using is of HttpClient 3.x , that I have found out from this link. check the link. http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

所以是版本问题.

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

我还找到了一些与此问题的潜在解决方案相关的链接.

I have also found some links with potential solution of this problem.

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

Android 上的 Apache HttpClient 4.1

Apache HTTP 的版本客户端捆绑在 Android 1.6 中?

从这些链接中,我得出的结论是,如果我们将Apache HttpClient升级到最新的稳定版本,则可以解决此问题.

From these links , I made a conclusion that if we upgrade the Apache HttpClient to latest stable version , then this problem can be solved.

但这根本不可能,因为Android Team已经正式停止了对Apache httpclient的支持.

But this is directly no possible , as Android Team has officially stopped the support for the Apache httpclient.

有了这个链接就可以解决了.我还没有尝试过,但我正在努力.

With this link It could be possible to solve. I have not tried it but I am working on it.

该库可以帮助升级Android中的httpclient版本.

It is the library that can help in upgrading httpclient version in Android.

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

另一种解决方案可能是使用 HttpURLConnection .我也在研究它.

The other solution could be using HttpURLConnection .I am also working on it.

但是在 stackoverflow 和 Internet 上的大多数人似乎在 Android 上使用 DefaultHttpCLient.当然,它也在我的整个应用程序中与我合作,包括登录、注册、从服务器和会话读取以及其他功能.只是它不能直接将一些文章发布到我的服务器 Drupal 网站.在服务器上注册用户时,它与POST请求完美配合.

But most people here on stackoverflow and Internet seems to using DefaultHttpCLient with Android. And ofcourse it is also working with me throughout my application including login,registration,reading from server and session and other functionality.Just it is not working with directly post some article to my server-Drupal website. It works perfectly with POST request during registration of user on server.

朋友们,有什么建议吗?为什么它不能仅用于发布文章?

So friends , any suggestions regarding this ? why it is not working just with posting article ?

推荐答案

为什么它可以在 PhoneGap 中运行,而不能在 Java 中运行.PhoneGap 在 Web 容器中运行该应用程序,因此已经通过身份验证 - 您拥有所有正确的 cookie.AJAX 将共享同一个会话,一切都正常工作".

How come it works from the PhoneGap but not Java. PhoneGap runs the app in a web container and so already has been authenticated - and you have all the right cookies. AJAX will share the same session that and everything 'just works'.

然而,HTTPClient 是完全不同的 - 您正在启动一个全新的 HTTP 会话,并且一切都必须正确.

However HTTPClient is a completely different - you are initiating a brand new HTTP session and everything has to be right.

关于 HTTP 身份验证如何工作的一些评论:

A few comments on how HTTP Auth works:

有多种 HTTP 身份验证方法 - 由网络服务器选择.在继续之前,请检查您的 Drupal 配置以确定它是否是:

There are several HTTP authentication methods - and it's the web server that chooses which. Before going any further, check your Drupal configuration to work out whether it is:

  • Basic Auth (username and password). Everyone and their dog supports this, but it's very insecure. See http://en.wikipedia.org/wiki/Basic_access_authentication for more details
  • Digest (username and challenge/response hash with MD5. This is more secure but much more complex. Note that MD5 is generally considered weak now. Many libraries support it, including Apache. See http://en.wikipedia.org/wiki/Digest_access_authentication for more details
  • NTLM (a variant of Kerberos/SPEGNO) which is implemented on IIS. This is not generally supported from Java, although HTTPClient does profess to - but using a different Credentials object. See http://hc.apache.org/httpclient-3.x/authentication.html#NTLM

(还要注意,Web 容器具有智能"功能,可以根据服务器的要求尝试不同的身份验证方法,所有这些都在幕后进行)

(Note also that the web container has the 'smarts' to be able to try different authentication methods as requested by the server, all behind the scenes)

还要检查 Drupal 网络日志.几点说明:

Also check the Drupal web logs. A few pointers:

  • 您是否看到了 HTTPClient 连接.并且是指向正确资源的 URL.总是值得从服务器的角度检查 ...
  • 它是否转到了正确的服务器?可能出错的一个示例:您是否使用 IPURL 中针对多宿主 Web 服务器的地址,因此请求会转到错误的服务器?
  • 先检查客户端发送的身份验证类型是否正确(基本、摘要、NTLM)
  • Did you see the HTTPClient connect at all. And is the URL going to the correct resource. Always worth checking from the server's perspective...
  • Did it go to the right server? One example of what could go wrong: Are you using IP addresses in the URL against a multi-homed web server, so the request goes to the wrong server?
  • Check that the authentication sent by the client pre-emptively is the correct type (basic, digest, NTLM)

如果这有帮助,请告诉我.如果没有,您可以根据这篇文章提供更多详细信息,我可以跟进提供更多建议.

Let me know if this helps. If not, and you can give more details as per this post, I can follow up with more advice.

这篇关于身份验证错误:无法响应以下任何挑战:{} Android - 401 Unauthorized的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆