2012-08-09 19 views
11

error de autenticación: No se puede responder a cualquiera de estos desafíos: {} Android - 401 no autorizado de referenciaError de autenticación: No se puede responder a cualquiera de estos desafíos: {} Android - 401 no autorizado

he tomado desde este enlace Authentication Error when using HttpPost with DefaultHttpClient on Android

Estoy trabajando en la aplicación de Android en la que está respaldado en Drupal. En eso estoy enviando datos de la aplicación de Android al sitio web de drupal: servicio web en formato JSON. Ahora puedo leer datos JSON del servicio web de Drupal y escribirlos en mi aplicación para Android. Pero frente a un problema por escrito en Drupal desde androide, que genera la respuesta con código de estado

401 Unauthorized

De aplicación nativa de Android que genera 401, mientras que de PhoneGap-del androide cuando se inicio petición AJAX funciona perfectamente & escribe un artículo o página en el sitio web de drupal. por lo que significa el trabajo de servicio web perfectamente &

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

aquí es mi código java para 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í es el Logcat que estoy recibiendo.

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 

Aquí está mi PhoneGap Ajax solicite que funcione a la perfección.

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

tengo intenté varios métodos para mi error en httpcliente de Apache. Durante este tiempo investigué y busqué en Google y descubrí algunas cosas interesantes.

1st Lo que encontré es que Android-Google Oficialmente no recomienda Apache HttpClient que estoy usando en mi código. Mira este enlace En ese mensaje de Enlace de Jesse Wilson del equipo de Dalvik. En que sugieren utilizar HttpURLConnection en lugar de DefaultHttpClient y también escrito que el equipo de Android ya no desarrollará Apache httpclient. así que es la versión anterior que estoy usando.

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

segundo cosa que he encontrado forma de este enlace. Sugiere que Android se envía con HttpClient 4.0 Beta2 de Apache, que tiene un inconveniente, cuando se trata de la Autenticación básica. El método de autenticación que estoy usando es de HttpClient 3.x, que he descubierto en este enlace. revisa el enlace. http://hc.apache.org/httpclient-3.x/authentication.html#Preemptive_Authentication

Así que el problema de la versión.

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

También he encontrado algunos enlaces con posibles soluciones a este problema.

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?

A partir de estos enlaces, hice una conclusión que si aumentamos el Apache HttpClient a la última versión estable, entonces este problema se puede resolver.

Pero esto directamente no es posible, ya que Android Team ha detenido oficialmente el soporte para el httpclient de Apache.

Con este enlace podría ser posible resolver. No lo he intentado pero estoy trabajando en eso.

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

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

La otra solución podría estar utilizando HttpURLConnection .I También estoy trabajando en ella.

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, incluido el inicio de sesión, el registro, la lectura desde el servidor y la sesión, y otras funcionalidades. Simplemente no funciona con publicar directamente un artículo en mi servidor: el sitio web de Drupal. Funciona perfectamente con la solicitud POST durante el registro del usuario en el servidor.

Así que amigos, ¿alguna sugerencia sobre esto? ¿Por qué no funciona solo con publicar un artículo?

+0

También he visto esta pregunta http://stackoverflow.com/questions/10407547/error-http-1-1-401-unauthorized-with-basic-authentication-in-android-ews-201? rq = 1 & lo probé en mi código ... con el nombre de usuario y la contraseña, pero todavía no funcionaba. Sigue la misma respuesta -> 401 –

+0

Pruebe http: // stackoverflow.com/questions/8022800/problems-doing-ajax-requests-with-a-phonegap-application –

+0

@ChanchalShelar No tengo problemas con el teléfono ... funciona perfectamente ... Tengo un problema con la aplicación Android de Java. Así que aquí mi pregunta es: el mismo servidor funciona con Phonegap, entonces ¿por qué no funciona con Android? –

Respuesta

1

Usted puede tratar de comprobar: How to do http post using apache httpclient with web authentication?

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

+0

Déjame intentarlo. Luego actualizaré la información aquí. Gracias. –

+1

hola, he intentado la solución con HttpRequestInterceptor mencionado en ese enlace. Pero ahora recibo este error "Error de autenticación: se espera un desafío de autorización básico, pero no se ha encontrado" ... ¿alguna solución al respecto? –

2

¿Cómo es que funciona desde el 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 correctas. AJAX compartirá la misma sesión y todo 'simplemente funciona'.

Sin embargo, HTTPClient es completamente diferente: está iniciando una nueva sesión HTTP y todo debe ser correcto.

algunos comentarios sobre cómo funciona HTTP de autenticación:

Hay varios métodos de autenticación HTTP - y es el servidor web que elige qué. Antes de ir más lejos, verifique su configuración de Drupal para determinar si es:

(Tenga en cuenta también que el contenedor web tiene la 'inteligencia' para ser capaz de probar diferentes métodos de autenticación conforme a lo solicitado por el servidor, todos detrás de las escenas)

También puedes ver los registros web de Drupal. Un par de punteros:

  • ¿Viste el HTTPClient conectar en absoluto. Y es la URL que va al recurso correcto. Siempre vale la pena consultar desde la perspectiva del servidor ...
  • ¿Ha ido al servidor correcto? Un ejemplo de lo que podría salir mal: ¿está usando las direcciones IP en la dirección URL contra un servidor web multi-hogar, por lo que la solicitud va al servidor incorrecto?
  • Compruebe que la autenticación enviada por el cliente de forma preventiva es del tipo correcto (básica, implícita, NTLM)

Déjame saber si esto ayuda. Si no, y puede dar más detalles según esta publicación, puedo seguir con más consejos.

+0

Hola Andrew Gracias por responder. Por favor revisa la pregunta que he editado. He buscado en Google y he descubierto algunas cosas interesantes. Y sí, he verificado el registro del servidor, HttpClient se conecta con el servidor. –

+1

Genial. Leí estas respuestas. La mayoría de los problemas y errores parecen referirse a Android 1.5 y 1.6. Estás en 2.3, que es mucho mejor que estas otras versiones. ¿Tiene los registros HTTP de la solicitud como los ve el servidor? ¿Has olfateado la conexión y has comprobado qué es exactamente lo que está fallando, por ejemplo: usando wireshark o Fiddler: http://stackoverflow.com/questions/4853094/best-way-to-analyze-http-traffic-sent-by-my- código-java –

+0

Este es también un artículo útil, aunque dirigido para iOS: http://www.tuaw.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a- dime/ –

1

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

De esta manera podrá probar su llamada de muchas maneras que El dolor está yendo directamente en el cliente (a veces está cambiando de http a https o agregando el tipo de su token en el encabezado Authorization y es mucho más fácil que se lo haga on the fly).

Una vez que todo funcione como se espera, reproduzca la misma llamada, encabezados y cuerpo en su cliente y estará listo para comenzar.

+1

Preste especial atención a los arreglos y matrices JSON. Algunos servicios no admiten (o esperan) solo un tipo de solicitud. (es decir: usar objetos en lugar de matrices con nombres de propiedades tipo matriz -> "proveedor [0]": "DHL", etc.). –

+0

Hola José, Gracias por responder. Lado PHP Estoy usando drupal. Puedo usar el complemento de póster de Firefox para probar mi servicio y el objeto o arreglo JSON para mi solicitud tal como me sugirió. https://addons.mozilla.org/en-US/firefox/addon/poster/ Déjame probarlo y luego te enviaré un mensaje nuevamente. Gracias. –

1

Me encontré con el mismo "DefaultRequestDirector: error de autenticación: no se puede responder a ninguno de estos desafíos: {}" problema con los servicios de Drupal usando el loopj android-async-http library (lo recomiendo encarecidamente).

La clave de la solución para mí estaba en el comentario de José L Ugia en una de las respuestas sobre prestar especial atención a la salida JSON de Drupal. Estaba tratando de atrapar un JSONObject pero el mensaje real estaba en formato de matriz "[" Nombre de usuario o contraseña incorrectos "]]. El cambio a JSONArray captó el error correctamente y me permitió manejarlo. En su caso, creo que es porque no está publicando las credenciales de inicio de sesión ya que los servicios drupal lo esperan.

Debería recordar con Drupal Services que debe hacer el sistema/conectarse y tomar la sesión, seguido del usuario/inicio de sesión (y el usuario/contraseña ingresados ​​como parámetros) y tomar la sesión y luego todas sus solicitudes posteriores deberían funcionar. Es por eso que me gusta usar la biblioteca loopj porque hace que todas estas solicitudes sean más manejables. Aquí hay un ejemplo muy básico de conexión a drupal con loopj. Todas las publicaciones posteriores se hacen fácilmente usando los parámetros.

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"); 
     } 
    }); 
    } 
Cuestiones relacionadas