plugin jquery rest cordova http-basic-authentication

plugin - Jquery.ajax falla cuando el nombre de usuario de autenticación básica tiene el símbolo @(ios/cordova)



plugin cordova whitelist (3)

Tengo una aplicación phonegap con jQuery 1.9.1 Funcionó muy bien siempre que el nombre de usuario no tenga el símbolo ''@'' (como en las direcciones de correo electrónico). Solo falla en iOS.

Sospecho que probablemente no está urlizando el signo @ o algo así.

  • iPhone , nunca golpea ninguna devolución de llamada (hecho, falla o siempre), Wireshark muestra que la solicitud no llega al servidor .
  • Chrome Desktop : funciona bien.
  • Android , funciona bien.

    $.ajax({ url: "https://" + this.hostname + "/alertusmw/services/rest/" + endPoint, type: method, dataType: ''json'', contentType: ''application/com.alertus-v1.0+json'', cache:false, username: this.username, password: this.password, beforeSend: function (xhr) { xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode(this.username + ":" + this.password)); }, data: options.data }).done(function(response) { console.log("DONE: " + method + '' completed: ''); console.log(response); options.success( response ); }) .fail(function(jqXHR, textStatus, errorThrown) { console.log("FAIL: " + method + " FAILED: " + textStatus + "/n" + "ERROR THROWN: " + errorThrown); console.log("jqXHR thing: ", jqXHR); options.error(jqXHR,textStatus,errorThrown); }) .always(function(jqXHR, textStatus, errorThrown) { console.log("In the always", jqXHR, textStatus, errorThrown); });

    • Verificado el encabezado de base64 es idéntico en el escritorio de iPhone y Chrome.
    • No es un problema de certificado SSL.
    • No es un problema de cors
    • No es un usuario / pase no válido

Nuevamente funciona perfectamente si el nombre de usuario no tiene una ''@''

La razón por la que sospecho que es algo con la codificación de URL es si se publicara como: https://user@domain:[email protected] , el navegador probablemente no incluiría la parte de domain:password como el host (ya que el primer @ es lo que separa al usuario: pasar del dominio ...

Esto es lo que me dio la pista para esto:

^ - Pensé que todo el punto de la codificación base64 era exactamente para evitar que los caracteres especiales causen problemas ... así que pensé que tal vez esto era útil para Chrome ...

Publicaciones SO relacionadas: - La autenticación básica falla en cordova ios (sin respuestas, ligeramente diferente)


Apuesto a que el problema no es usar un contentType : "application/x-www-form-urlencoded" .

De todos modos, definitivamente debe depurar su Webview frente a un dispositivo real, para buscar errores xhr en la consola de Safari. Si no está familiarizado con la depuración remota de Safari, es fácil:

  • en su iPhone / iPad, vaya a Configuración -> Safari -> Avanzado => Habilitar Web Inspector.
  • conéctese a MacOSX por cable y seleccione su aplicación del menú "Desarrollo" de Safari en su escritorio
  • Ahora verifique cualquier error con respecto a su solicitud, o mejor aún, depure el código y las devoluciones de llamadas paso a paso.

Pruebe a envolver encodeURIComponent () antes de la codificación base64.

beforeSend: function (xhr) { xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode(encodeURIComponent(this.username + ":" + this.password))); },


Cuando el texto codificado en base64 está SIN codificar en el otro extremo, todavía se ve como (como usted dijo), user@domain:[email protected] Intente tener una función como esta:

var getAuthToken = function (user, pass) { var token = ""; if (user) { token = token + encodeURIComponent(user); } if (pass) { token = token + ":" + encodeURIComponent(pass); } token = $.base64.encode(token); return "Basic " + token; };

Entonces simplemente cambie su código levemente:

xhr.setRequestHeader("Authorization", getAuthToken(this.username, this.password));