Cómo suprimir la autenticación del navegador & # 8220; requiere & # 8221; diálogo al hacer una llamada ajax que requiere autenticación?

StackOverflow https://stackoverflow.com/questions/1626919

  •  06-07-2019
  •  | 
  •  

Pregunta

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 un nombre de usuario y contraseña incorrectos, el navegador (al menos Firefox) mostrará una "autenticación requerida". diálogo. 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 / pase original que ingresaron fue correcto, cuando no lo es (ya que lo cambiaron).

¿Hay alguna forma de suprimir este cuadro de diálogo (para que mi servicio pueda decirles que corrijan su usuario / contraseña) o de alguna manera obtener el nombre de usuario y la contraseña correctos que el usuario ingresó en el cuadro de diálogo del navegador? 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);
  }
});
¿Fue útil?

Solución

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

Del mismo modo, el proxy siempre puede devolver un 200 con una respuesta json que indica los resultados de la solicitud reenviada. De esta manera, puede discernir la diferencia entre una falla de su proxy y la respuesta del servicio.

Una cosa difícil con la que tiene que lidiar: si el servicio remoto responde con un encabezado de cookie establecida, digamos porque ha creado una sesión para su cliente, entonces tiene (al menos) 2 caminos posibles a seguir.

  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 crear una sesión huérfana con el servicio

Otros consejos

En lugar de que la cadena de url sea " http://blah.com " ;, hágalo " < a href = "http: // usuario: contraseña@blah.com" rel = "nofollow noreferrer"> http: // usuario: contraseña@blah.com "

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

Sin jquery (no funciona en IE, pero está bien para 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();

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

No puede hacerlo en IE o firefox, y nunca podrá hacerlo desde javascript por razones de seguridad. No hay una configuración del navegador que 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top