Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Error de autenticación: no se puede responder a ninguno de estos desafíos: {} Android – 401 no autorizado

Error de autenticación: no se puede responder a ninguno de estos desafíos: {} Android – 401 no autorizado

He tomado la referencia de este acoplamiento Error de la autentificación al usar HttpPost con DefaultHttpClient en Android

Estoy trabajando en la aplicación Android en que respaldado en Drupal. En que estoy enviando datos de la aplicación android a drupal sitio web – webservice en formato JSON. Ahora puedo leer los datos de JSON de Drupal webservice y escribirlo en mi aplicación android. Pero frente a un problema al escribir en drupal desde android, genera respuesta con código de estado

401 no autorizado

Desde la aplicación nativa de Android genera 401, mientras que desde phonegap-desde android cuando inicie la solicitud AJAX funciona perfectamente y escribe un artículo o página en el sitio web drupal. De modo que los medios trabajan perfectamente webservice &

Mi aplicación androide phonegap funciona perfectamente hay un problema con la aplicación nativa de Java JAVA Estoy ejecutando mi aplicación android en Android2.3.4 -> Samsung Galaxy S Plus – Samsung GT-I9001

Aquí está mi código para 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; } } } 

Aquí está el logcat que estoy recibiendo.

  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 

Aquí está mi solicitud de PhoneGap Ajax que funciona perfectamente.

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

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

Editar:

He intentado varios métodos para el httpclient de Apache para mi error.During esta vez he hecho una cierta investigación y buscado en google y encontré algunas cosas interesantes.

Lo primero que encontré que Android-Google oficialmente no recomienda Apache HttpClient que estoy utilizando en mi código. Compruebe este enlace. En ese mensaje Link de Jesse Wilson del equipo de Dalvik. En que sugieren utilizar HttpURLConnection en lugar de DefaultHttpClient y también escribió que el equipo de Android ya no desarrollará Apache httpclient. Por lo que es la versión más antigua que estoy usando.

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

cosa que he encontrado en este enlace. Se sugiere que Android se está enviando con Apache HttpClient 4.0 Beta2, que tiene una trampa, cuando se trata de la autenticación básica. El método de autenticación que estoy utilizando es de HttpClient 3.x, que he encontrado desde este enlace. Revise el enlace Http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

Así que la edición de la versión.

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

También he encontrado algunos enlaces con la solución potencial de este problema.

Using newer version of HttpClient on Android (like 4.1.x)

Apache HttpClient 4.1 en Android

¿Qué versión de Apache HTTP Client está incluida en Android 1.6?

De estos enlaces, he llegado a la conclusión de que si actualizamos el Apache HttpClient a la última versión estable, entonces este problema puede ser resuelto.

Pero esto es directamente imposible, ya que Android Team ha detenido oficialmente el soporte para el cliente http de Apache.

Con este enlace Podría ser posible resolver. No lo he probado, pero estoy trabajando en ello.

Es la biblioteca que puede ayudar a actualizar la versión httpclient en Android.

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

La otra solución podría estar usando HttpURLConnection . También estoy trabajando en ello.

Pero la mayoría de la gente aquí en stackoverflow e Internet parece usar DefaultHttpCLient con Android. Y por supuesto también está trabajando conmigo a lo largo de mi aplicación, incluyendo el inicio de sesión, el registro, la lectura del servidor y la sesión y otras funcionalidades. Simplemente no está funcionando con directamente publicar algún artículo a mi sitio web de servidor Drupal. Funciona perfectamente con la solicitud POST durante el registro del usuario en el servidor.

Así que amigos, cualquier sugerencia con respecto a esto? ¿Por qué no está funcionando sólo con el artículo de publicación?

  • Error org.json.JSONException: No hay valor para PROJECT_NAME Este es mi json
  • Opciones de comunicación peer-to-peer
  • JSONObject no serializable?
  • Hacer una solicitud de GSON utilizando volley
  • Pojo analiza gson con nombres de java no válidos
  • Analizar datos JSON utilizando JSONReader o JSONObject / JSONArray
  • Cómo pasar cadena en 'Body' Parámetro de Retrofit 2 en android
  • Cómo analizar los resultados de JSON de Unirest llamada
  • 4 Solutions collect form web for “Error de autenticación: no se puede responder a ninguno de estos desafíos: {} Android – 401 no autorizado”

    ¿Cómo es que funciona desde PhoneGap pero no Java. PhoneGap ejecuta la aplicación en un contenedor web y, por lo tanto, ya se ha autenticado y tiene todas las cookies adecuadas. AJAX compartirá la misma sesión que y todo 'sólo funciona'.

    Sin embargo HTTPClient es completamente diferente – estás iniciando una nueva sesión HTTP y todo tiene que ser correcto.

    Algunos comentarios sobre cómo HTTP Auth funciona:

    Hay varios métodos de autenticación HTTP – y es el servidor web el que elige qué. Antes de seguir adelante, compruebe la configuración de Drupal para determinar si es:

    • Autenticación básica (nombre de usuario y contraseña). Todo el mundo y su perro apoya esto, pero es muy inseguro. Consulte http://en.wikipedia.org/wiki/Basic_access_authentication para obtener más detalles
    • Digest (nombre de usuario y hash de reto / respuesta con MD5) Esto es más seguro, pero mucho más complejo Observe que MD5 generalmente se considera débil ahora Muchas bibliotecas lo admiten, incluyendo Apache Ver http://en.wikipedia.org/wiki/ Digest_access_authentication para más detalles
    • NTLM (una variante de Kerberos / SPEGNO) que se implementa en IIS. Esto no es generalmente compatible con Java, aunque HTTPClient no profesa – pero utilizando un objeto Credentials diferente. Consulte http://hc.apache.org/httpclient-3.x/authentication.html#NTLM

    (Tenga en cuenta también que el contenedor web tiene el 'smarts' para poder probar diferentes métodos de autenticación según lo solicitado por el servidor, todo detrás de las escenas)

    También compruebe los registros de web de Drupal. Algunos consejos:

    • ¿Has visto el HTTPClient conectar en absoluto . Y es la URL que va al recurso correcto. Siempre vale la pena revisar desde la perspectiva del servidor
    • ¿Fue al servidor correcto? Un ejemplo de lo que podría salir mal: ¿Está utilizando direcciones IP en la URL contra un servidor web multi-homed, por lo que la solicitud va al servidor equivocado?
    • Compruebe que la autenticación enviada por el cliente de forma preventiva es el tipo correcto (básico, resumen, NTLM)

    Déjeme saber si esto ayuda. Si no, y usted puede dar más detalles como por este poste, puedo seguir con más consejo.

    Usted puede tratar de comprobar: ¿Cómo hacer http post utilizando apache httpclient con la autenticación web?

    Utiliza un HttpInterceptor para inyectar los datos de autenticación, cuando sea necesario

    Sugiero probar primero el lado de PHP fuera de la aplicación. Hay varias maneras de hacer sus propias llamadas incluyendo encabezados y autenticación. De curl a GraphicalHttpClient (http://itunes.apple.com/us/app/graphicalhttpclient/id433095876?mt=12, personalmente uso eso y funciona decentemente). Hay algunas otras opciones como REST cliente depurador (https://addons.mozilla.org/en-US/firefox/addon/restclient/)

    De esta manera podrás probar tu llamada de tantas maneras que es el dolor de hacer directamente en el cliente (a veces es simplemente el cambio de http a https o añadir el tipo de su ficha en el encabezado de autorización y que es mucho más fácil de ser madeo N la mosca).

    Una vez que todo funciona como se espera, reproducir la misma llamada, los encabezados y el cuerpo en su cliente y usted está listo para ir.

    Yo estaba corriendo en el mismo problema "DefaultRequestDirector: Error de autenticación: No se puede responder a cualquiera de estos desafíos: {}" con los servicios de Drupal usando la biblioteca loopj android-async-http (lo recomiendo).

    La clave de la solución para mí fue en el comentario de José L Ugia en una de las respuestas con respecto a prestar especial atención a la salida JSON de Drupal. Estaba intentando coger un JSONObject pero el mensaje verdadero estaba en formato del arsenal "[" username o contraseña incorrecto. "]". Cambiar a JSONArray detectó el error correctamente y me permitió manejarlo. En su caso creo que es porque usted no está publicando las credenciales de inicio de sesión como los servicios drupal lo espera.

    Usted debe recordar con Drupal Services que debe hacer system / connect y agarrar la sesión, seguido de usuario / login (y el usuario / contraseña pasó como parámetros) y agarrar la sesión y, a continuación, todas las solicitudes posteriores deberían funcionar. Esta es la razón por la que me gusta usar la biblioteca loopj porque hace que todas estas peticiones sean más manejables. Aquí hay un ejemplo muy básico de conexión a drupal con loopj. Todos los posts subsiguientes se hacen fácilmente usando los 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"); } }); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.