2012-08-09 23 views
11

Lỗi xác thực: Không thể trả lời bất kỳ thách thức nào sau đây: {} Android - 401 Không được phépLỗi xác thực: Không thể phản hồi bất kỳ thách thức nào sau đây: {} Android - 401 Không được phép

Tôi đã tham khảo từ liên kết này Authentication Error when using HttpPost with DefaultHttpClient on Android

Tôi đang làm việc trên ứng dụng Android được hỗ trợ trong Drupal. Trong đó tôi đang gửi dữ liệu từ ứng dụng Android đến trang web drupal - webservice ở định dạng JSON. Bây giờ tôi có thể đọc dữ liệu JSON từ dịch vụ web Drupal và viết nó trong ứng dụng Android của tôi. Nhưng đối mặt với vấn đề bằng văn bản về drupal từ android, nó tạo ra phản ứng với mã trạng thái

401 Unauthorized

Từ ứng dụng bản địa android nó tạo ra 401, trong khi từ PhoneGap-từ android khi tôi đưa ra yêu cầu AJAX nó hoạt động hoàn hảo & viết một bài báo hay trên trang web drupal. điều đó có nghĩa là webservice hoạt động hoàn hảo &

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

đây là mã của tôi cho 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; 
      } 

    } 

    } 

đây là logcat mà tôi nhận được.

08-09 12:41:29.063: I/System.out(336): value of the post =============>  [email protected] 
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 

Đây là yêu cầu PhoneGap Ajax của tôi hoạt động hoàn hảo.

$('#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; 

}); 

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

Chỉnh sửa:

Tôi có đã thử nhiều phương pháp khác nhau cho Apache httpclient cho lỗi của tôi. Thời gian này tôi đã thực hiện một số nghiên cứu và tìm kiếm trên google và phát hiện ra một số nội dung thú vị.

1st điều mà tôi thấy rằng Android-Google Chính thức không đề xuất Apache HttpClient mà tôi đang sử dụng trong mã của mình. Kiểm tra liên kết này. Trong thông điệp liên kết đó từ Jesse Wilson từ nhóm Dalvik. Trong đó họ đề nghị sử dụng HttpURLConnection thay vì DefaultHttpClient và cũng được viết rằng nhóm Android sẽ không còn phát triển Apache httpclient nữa. do đó, phiên bản cũ hơn tôi đang sử dụng.

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

2nd điều mà tôi đã tìm thấy tạo liên kết này. Nó cho thấy rằng Android được vận chuyển với HttpClient 4.0 Beta2 của Apache, có một lỗ hổng, khi nói đến Xác thực cơ bản. Phương pháp xác thực mà tôi đang sử dụng là của HttpClient 3.x, mà tôi đã tìm thấy từ liên kết này. kiểm tra liên kết. http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

Vì vậy, vấn đề phiên bản.

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

Tôi cũng đã tìm thấy một số liên kết với giải pháp tiềm năng của vấn đề này.

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

Apache HttpClient 4.1 on Android

What version of Apache HTTP Client is bundled in Android 1.6?

Từ các liên kết này, tôi đã kết luận rằng nếu chúng tôi nâng cấp Apache HttpClient lên phiên bản ổn định mới nhất thì vấn đề này có thể được giải quyết.

Nhưng điều này là không thể trực tiếp, vì Nhóm Android đã chính thức ngừng hỗ trợ cho httpclient Apache.

Với liên kết này Có thể giải quyết được. Tôi đã không thử nó nhưng tôi đang làm việc trên nó.

Đây là thư viện có thể giúp nâng cấp phiên bản httpclient trong Android.

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

Các giải pháp khác có thể được sử dụng HttpURLConnection .Tôi cũng đang làm việc trên nó.

Nhưng hầu hết mọi người ở đây trên stackoverflow và Internet dường như sử dụng Mặc địnhHttpCLient bằng Android. Và ofcourse nó cũng làm việc với tôi trong suốt ứng dụng của tôi bao gồm đăng nhập, đăng ký, đọc từ máy chủ và phiên và chức năng khác.Chỉ cần nó không làm việc trực tiếp gửi một số bài viết đến trang web máy chủ-Drupal của tôi. Nó hoạt động hoàn hảo với yêu cầu POST trong quá trình đăng ký người dùng trên máy chủ.

Vì vậy, bạn bè, mọi đề xuất liên quan đến điều này? tại sao nó không hoạt động chỉ với bài viết?

+0

Tôi cũng đã xem câu hỏi này http://stackoverflow.com/questions/10407547/error-http-1-1-401-unauthorized-with-basic-authentication-in-android-ews-201? rq = 1 & đã thử nó trong mã của tôi ... với tên người dùng và mật khẩu đã chuyển, nhưng nó vẫn không hoạt động. Vẫn phản hồi tương tự -> 401 –

+0

Thử http: // stackoverflow.com/questions/8022800/problem-doing-ajax-yêu-với-một-phonegap-ứng dụng –

+0

@ChanchalShelar Tôi không phải đối mặt với vấn đề với phonegap ... nó hoạt động hoàn hảo ... Tôi có vấn đề với ứng dụng Java Android. Vì vậy, ở đây câu hỏi của tôi là: cùng một máy chủ làm việc với Phonegap, sau đó tại sao nó không hoạt động với Android. –

Trả lời

1

Bạn có thể thử để kiểm tra: How to do http post using apache httpclient with web authentication?

Nó sử dụng một HttpInterceptor để tiêm dữ liệu xác thực, khi có yêu cầu

+0

Hãy để tôi thử. Sau đó, tôi sẽ cập nhật thông tin tại đây. Cảm ơn. –

+1

hi, tôi đã thử giải pháp với HttpRequestInterceptor được đề cập trong liên kết đó. Nhưng bây giờ tôi nhận được lỗi này "Lỗi xác thực: thách thức ủy quyền cơ bản dự kiến, nhưng không tìm thấy" ... bất kỳ giải pháp về điều này? –

2

Tại sao nó hoạt động từ PhoneGap nhưng không phải Java. PhoneGap chạy ứng dụng trong một thùng chứa web và do đó đã được xác thực - và bạn có tất cả các cookie phù hợp. AJAX sẽ chia sẻ cùng một phiên và mọi thứ 'chỉ hoạt động'.

Tuy nhiên, HTTPClient hoàn toàn khác - bạn đang bắt đầu phiên HTTP mới và mọi thứ đều đúng.

Một vài nhận xét về cách thức hoạt động của HTTP Auth:

Có một số phương pháp xác thực HTTP - và đó là máy chủ web chọn tùy chọn nào. Trước khi tiếp tục, hãy kiểm tra cấu hình Drupal của bạn để tìm hiểu xem đó có phải là:

  • Auth cơ bản (tên người dùng và mật khẩu). Mọi người và con chó của họ đều ủng hộ điều này, nhưng nó rất không an toàn. Xem http://en.wikipedia.org/wiki/Basic_access_authentication để biết thêm chi tiết
  • Thông báo (tên người dùng và thách thức/phản hồi băm với MD5.Đây là an toàn hơn nhưng phức tạp hơn nhiều. Lưu ý rằng MD5 thường được xem là yếu. Nhiều thư viện hỗ trợ nó, bao gồm Apache.
  • NTLM (một biến thể của Kerberos/SPEGNO) được triển khai trên IIS. Điều này thường không được hỗ trợ từ Java, mặc dù HTTPClient không xưng hô - nhưng sử dụng một đối tượng Credentials khác.Xem http://hc.apache.org/httpclient-3.x/authentication.html#NTLM

(Cũng lưu ý rằng những trang web chứa có 'thông minh' để có thể thử phương pháp xác thực khác nhau theo yêu cầu của máy chủ, tất cả đằng sau hậu trường)

Ngoài ra kiểm tra các bản ghi web Drupal. Một vài gợi ý:

  • Bạn có thấy kết nối HTTPClient ở tất cả. Và URL sẽ đến đúng tài nguyên. Luôn kiểm tra giá trị từ góc nhìn của máy chủ ...
  • Đã đến máy chủ phù hợp chưa? Một ví dụ về những gì có thể xảy ra: Bạn có đang sử dụng địa chỉ IP trong URL đối với máy chủ web nhiều người, vì vậy yêu cầu đến máy chủ không đúng?
  • Kiểm tra xác thực gửi của khách hàng trước emptively là đúng loại (cơ bản, tiêu hóa, NTLM)

Hãy cho tôi biết nếu điều này giúp. Nếu không, và bạn có thể cung cấp thêm chi tiết theo bài đăng này, tôi có thể theo dõi thêm lời khuyên.

+0

Xin chào Andrew Cảm ơn bạn đã trả lời. Vui lòng kiểm tra câu hỏi tôi đã chỉnh sửa nó. Tôi đã tìm kiếm trên Google và tìm ra một số nội dung thú vị. Và có, tôi đã kiểm tra trên nhật ký máy chủ, HttpClient kết nối với máy chủ. –

+1

Tuyệt vời. Tôi đọc những câu trả lời này. Hầu hết các vấn đề và lỗi dường như là về Android 1.5 và 1.6 - bạn đang ở trên 2.3, đó là cách tốt hơn so với các phiên bản khác. Bạn có các bản ghi HTTP của yêu cầu mà máy chủ nhìn thấy không? Bạn đã đánh hơi kết nối và kiểm tra chính xác những gì đang xảy ra sai, ví dụ: sử dụng wireshark hoặc Fiddler: http://stackoverflow.com/questions/4853094/best-way-to-analyze-http-traffic-sent-by-my- java-code –

+0

Đây cũng là một bài viết hữu ích, mặc dù được nhắm mục tiêu cho iOS: http://www.tuaw.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a- dime/ –

1

Tôi khuyên bạn nên kiểm tra đầu tiên của PHP trong ứng dụng. Có một số cách để thực hiện cuộc gọi của riêng bạn bao gồm tiêu đề và xác thực. Từ curl đến GraphicalHttpClient (http://itunes.apple.com/us/app/graphicalhttpclient/id433095876?mt=12, cá nhân tôi sử dụng nó và nó hoạt động decently). Có một số tùy chọn khác như trình gỡ rối ứng dụng khách REST (https://addons.mozilla.org/en-US/firefox/addon/restclient/)

Bằng cách này bạn sẽ có thể kiểm tra cuộc gọi của mình theo nhiều cách là nỗi đau làm trực tiếp trong ứng dụng khách (đôi khi nó chỉ thay đổi từ http thành https hoặc thêm loại mã thông báo của bạn vào tiêu đề Cấp phép và dễ dàng hơn khi được tạo).

Khi mọi thứ hoạt động như mong đợi, hãy tái tạo cùng một cuộc gọi, tiêu đề và nội dung trong ứng dụng khách của bạn và bạn đã sẵn sàng.

+1

Đặc biệt chú ý đến các mảng và mảng JSON. Một số dịch vụ không hỗ trợ (hoặc đang mong đợi) chỉ là một loại yêu cầu. (ví dụ: sử dụng các đối tượng thay vì mảng có tên thuộc tính kiểu mảng -> "nhà cung cấp [0]": "DHL", v.v ...). –

+0

Xin chào Jose, Cảm ơn bạn đã trả lời. PHP bên tôi đang sử dụng drupal. Tôi có thể sử dụng plugin firefox poster để thử nghiệm dịch vụ của tôi và đối tượng JSON hoặc mảng cho yêu cầu của tôi như bạn đã đề xuất. https://addons.mozilla.org/en-US/firefox/addon/poster/ Hãy để tôi thử và sau đó tôi sẽ nhắn lại cho bạn. Cảm ơn. –

1

Tôi đã chạy vào cùng một "DefaultRequestDirector: Lỗi xác thực: Không thể trả lời bất kỳ thách thức nào sau đây: {}" vấn đề với dịch vụ Drupal sử dụng số loopj android-async-http library (khuyên bạn nên sử dụng nó).

Chìa khóa cho giải pháp cho tôi là trong bình luận của Jose L Ugia về một trong những câu trả lời liên quan đến đặc biệt chú ý đến đầu ra JSON từ Drupal. Tôi đã cố gắng để bắt một JSONObject nhưng tin nhắn thực sự là trong định dạng mảng "[" Tên người dùng hoặc mật khẩu sai. "]". Chuyển sang JSONArray đã phát hiện lỗi đúng cách và cho phép tôi xử lý nó. Trong trường hợp của bạn, tôi tin rằng đó là bởi vì bạn không đăng các thông tin đăng nhập như các dịch vụ drupal mong đợi nó.

Bạn nên nhớ với dịch vụ Drupal bạn nên làm hệ thống/kết nối và lấy phiên, theo sau là người dùng/đăng nhập (và người dùng/mật khẩu được chuyển thành tham số) và lấy phiên và sau đó tất cả các yêu cầu tiếp theo của bạn sẽ hoạt động. Đây là lý do tại sao tôi thích sử dụng thư viện loopj vì nó làm cho tất cả các yêu cầu này dễ quản lý hơn. Đây là một ví dụ rất cơ bản về kết nối với drupal với loopj. Tất cả các bài viết tiếp theo có thể dễ dàng thực hiện bằng cách sử dụng các tham số.

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"); 
     } 
    }); 
    } 
Các vấn đề liên quan