2009-10-26 34 views
6

Mis usuarios ingresan un nombre de usuario y contraseña para un servicio de terceros. Hago una llamada ajax a ese servicio para autenticarlos. El problema es que si ingresan el nombre de usuario y la contraseña incorrectos, el navegador (al menos Firefox) mostrará un diálogo de "autenticación requerida". Si luego ingresan el nombre de usuario y la contraseña correctos en ese cuadro de diálogo, mi llamada ajax devolverá un "éxito", y parecerá que el usuario/contraseña original que ingresaron era correcto, cuando no lo es (ya que lo cambiaron).¿Cómo suprimir el diálogo de "autenticación requerida" del navegador cuando se realiza una llamada ajax que requiere autenticación?

¿Hay alguna manera de suprimir este cuadro de diálogo (para que mi servicio les diga que corrijan su usuario/contraseña) o de alguna manera tomar el nombre de usuario y la contraseña correctos que el usuario ingresó en el diálogo de navegadores? Esta es una extensión de Firefox ... así que estoy seguro de que hay alguna forma de obtener el pase/inicio de sesión correcto de la solicitud ... pero sería bueno si hubiera un método más simple a través de javascript.

jQuery.ajax({ 
    type: "GET", 
    dataType: "xml", 
    url: endpoint, 
    username: username, 
    password: password, 
    success: function(data,status) { 
    // Do something 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown){ 
    alert(errorThrown); 
    } 
}); 

Respuesta

1

He resuelto este problema al poner un proxy entre el navegador y el servicio que requiere autenticación, en mi caso, un servlet de Java. El navegador envía la solicitud AJAX al servlet, que reenvía la solicitud al servicio y luego envía la respuesta de los servicios, omitiendo el encabezado "WWW-Authenticate". Su aplicación de navegador. maneja el código de respuesta HTTP 200 o 401 en consecuencia.

De forma similar, el proxy siempre podría devolver un 200 con una respuesta json que indica los resultados de la solicitud reenviada. De esta forma, puede discernir la diferencia entre una falla de su proxy y la respuesta del servicio.

Una cosa complicada que puede tener que tratar: si el servicio lejano responde con un encabezado de conjunto de cookies, digamos porque ha creado una sesión para su cliente, entonces tiene (al menos) 2 rutas posibles para tomar .

  1. su proxy recordará la cookie, su aplicación de navegador. siempre pasa por el proxy para este servicio, y el proxy agrega esta cookie a las solicitudes reenviadas posteriores. o
  2. ignora la cookie del servicio y hace que el navegador vuelva a autenticarse directamente con el servicio una vez que haya verificado el nombre de usuario y la contraseña a través del proxy. Aunque esto puede tener el efecto secundario de la creación de una sesión huérfana con el servicio
1

En lugar de la cadena de URL ser "http://blah.com", que sea "http://user:[email protected]"

// Note that you might need to trim http:// out of endpoint first 
url: 'http://' + username + ':' + password + '@' + endpoint, 
+0

¿Resolvería eso realmente el problema? Esperaría que si el nombre de usuario y la contraseña especificados en la URL fueran incorrectos, el servidor remoto todavía emitiría una respuesta 401 ... –

-1

Usted no puede hacerlo en IE o Firefox, y que nunca será capaz de partir Javascript para razones de seguridad. No hay una configuración de navegador que le permita al usuario evitar que se le solicite la autenticación http. Esto se vuelve realmente molesto cuando tienes 50 imágenes que requieren autenticación http.

+0

no es cierto: https: //developer.mozilla.org/es/XmlHttpRequest # open% 28% 29 – Marius

0

Sin jQuery (no funciona en IE, pero eso está bien para un extensiones de Firefox):

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com", true, "username", "password"); 
xhr.onreadystatechange = function(){ 
    if(this.readyState == 4){ 
    if(this.status == 200){ 
     alert("we got a response"); 
    } 
    } 
} 
xhr.send(); 
0

¿Qué tal no usando Autenticación HTTP? Utilice un inicio de sesión estándar con cookies, o simplemente escriba el nombre de usuario/contraseña que el usuario proporciona al script y verifique los detalles en una base de datos de usuarios.

+0

Dijo que es la causa de un producto de un tercero. – jantimon

Cuestiones relacionadas