Hola, estoy trabajando en una aplicación web que tiene un cuadro de diálogo de inicio de sesión que funciona así:
- El usuario hace clic en "iniciar sesión"
- El formulario de inicio de sesión HTML se carga con AJAX y se muestra en DIV en la página
- El usuario ingresa user / pass en los campos y hace clic en enviar. NO es un
<form>
usuario / pase enviado a través de AJAX - Si el usuario / pase está bien, la página se vuelve a cargar con el usuario conectado.
- Si el usuario / pase es incorrecto, la página NO se vuelve a cargar, pero aparece un mensaje de error en DIV y el usuario puede volver a intentarlo.
Aquí está el problema: el navegador nunca ofrece el mensaje habitual "¿Guardar esta contraseña? Sí / Nunca / No ahora" que ofrece para otros sitios.
He intentado envolver el <div>
de <form>
etiquetas con "autocomplete = 'on'", pero que no hizo ninguna diferencia.
¿Es posible hacer que el navegador ofrezca almacenar la contraseña sin una modificación importante de mi flujo de inicio de sesión?
gracias Eric
PD para agregar a mi pregunta, definitivamente estoy trabajando con navegadores que almacenan contraseñas, y nunca he hecho clic en "nunca para este sitio" ... este es un problema técnico con el navegador que no detecta que es un formulario de inicio de sesión, no error del operador :-)
Respuestas:
Encontré una solución completa para esta pregunta. (He probado esto en Chrome 27 y Firefox 21).
Hay dos cosas que debes saber:
1. Activar 'Guardar contraseña':
Para Firefox 21 , 'Guardar contraseña' se activa cuando detecta que hay un formulario que contiene el campo de texto de entrada y se envía el campo de contraseña de entrada. Entonces solo necesitamos usar
someFunctionForLogin()
hace el inicio de sesión ajax y vuelve a cargar / redirigir a la página de inicio de sesión mientrasevent.preventDefault()
bloquea la redirección original debido al envío del formulario.Si solo trabajas con Firefox, la solución anterior es suficiente pero no funciona en Chrome 27. Luego preguntarás cómo activar 'Guardar contraseña' en Chrome 27.
Para Chrome 27 , 'Guardar contraseña' se activa después de que se redirige a la página enviando el formulario que contiene el campo de texto de entrada con el nombre de atributo = 'nombre de usuario' y el campo de contraseña de entrada con el nombre de atributo = 'contraseña' . Por lo tanto, no podemos bloquear la redirección debido al envío del formulario, pero podemos realizar la redirección después de haber realizado el inicio de sesión ajax. (Si desea que el inicio de sesión ajax no vuelva a cargar la página o no redirija a una página, desafortunadamente, mi solución no funciona). Entonces, podemos usar
El botón con type = 'button' hará que el formulario no se envíe al hacer clic en el botón. Luego, vincula una función al botón para iniciar sesión en ajax. Finalmente, la llamada
$('#loginForm').submit();
redirige a la página de inicio de sesión. Si la página de inicio de sesión es la página actual, puede reemplazar 'firmadoIn.xxx' por la página actual para hacer la 'actualización'.Ahora, encontrará que el método para Chrome 27 también funciona en Firefox 21. Por lo tanto, es mejor usarlo.
2. Restaure el nombre de usuario / contraseña guardado:
Si ya tiene el loginForm codificado como HTML, entonces no encontrará ningún problema para restaurar la contraseña guardada en el loginForm.
Sin embargo, el nombre de usuario / contraseña guardado no se vinculará al loginForm si usa js / jquery para hacer el loginForm dinámicamente, porque el nombre de usuario / contraseña guardado se vincula solo cuando se carga el documento.
Por lo tanto, debe codificar el loginForm como HTML y usar js / jquery para mover / mostrar / ocultar el loginForm dinámicamente.
Observación: si hace el inicio de sesión ajax, no agregue
autocomplete='off'
en forma de etiqueta comoautocomplete='off'
hará que el nombre de usuario / contraseña de restauración en el formulario de inicio de sesión falle porque no permite que 'autocomplete' el nombre de usuario / contraseña.fuente
ENTER
clave para enviar el formulario, ya queprevented default
cuando el usuario envió el formulario, no pasará nada, eso es una mala experiencia de usuario. Puede verificar la tecla enterkeycode
al enviar, sin embargo, volverá a la mendicidad ...Usando un botón para iniciar sesión:
Si usa un
type="button"
con unonclick
controlador para iniciar sesiónajax
, entonces el navegador no ofrecerá guardar la contraseña.Dado que este formulario no tiene un botón de enviar y no tiene un campo de acción, el navegador no ofrecerá guardar la contraseña.
Usando un botón de enviar para iniciar sesión:
Sin embargo, si cambia el botón
type="submit"
y maneja el envío, el navegador le ofrecerá guardar la contraseña.Con este método, el navegador debería ofrecer guardar la contraseña.
Aquí está el Javascript utilizado en ambos métodos:
fuente
He estado luchando con esto yo mismo, y finalmente pude rastrear el problema y lo que estaba causando que fallara.
Todo se debió al hecho de que mi formulario de inicio de sesión se inyectaba dinámicamente en la página (usando backbone.js). Tan pronto como inserto mi formulario de inicio de sesión directamente en mi archivo index.html, todo funcionó de maravilla.
Creo que esto se debe a que el navegador debe ser consciente de que existe un formulario de inicio de sesión existente, pero dado que el mío se estaba inyectando dinámicamente en la página, no sabía que existía un formulario de inicio de sesión "real".
fuente
Esta solución funcionó para mí publicada por Eric en los foros de codificación
Código:
Vea si eso hace que aparezca el mensaje.
Eric
Publicado en http://www.codingforums.com/showthread.php?t=123007
fuente
action
una página ficticia.iframe
necesitan soluciones alternativas. Ver stackoverflow.com/a/33113374/810109Hay una solución definitiva para obligar a todos los navegadores (probado: Chrome 25, Safari 5.1, IE10, Firefox 16) a solicitar que se guarde la contraseña con jQuery y ajax solicitud :
JS:
HTML:
El truco consiste en detener el formulario para enviarlo a su manera (event.stopPropagation ()), en su lugar envíe su propio código ($ .ajax ()) y en la devolución de llamada exitosa del ajax envíe el formulario nuevamente para que el navegador lo capture y muestre el solicitud de guardar contraseña. También puede agregar algún controlador de errores, etc.
Espero que haya ayudado a alguien.
fuente
login.php?username=username&password=password
que defató el propósito de guardar la contraseña en primer lugarevent listener
al formulario y agregarevent.preventDefault()
másevent.stopPropagation()
Intenté la respuesta de Spetson, pero eso no funcionó para mí en Chrome 18. Lo que funcionó fue agregar un controlador de carga al iframe y no interrumpir el envío (jQuery 1.7):
El HTML:
getSessions () realiza una llamada AJAX y muestra el div loginForm si falla. (El servicio web devolverá 403 si el usuario no está autenticado).
Probado para trabajar en FF e IE8 también.
fuente
/login
en su ejemplo) devuelva algún texto u otro contenido visible.iframe
necesitan soluciones alternativas. Ver stackoverflow.com/a/33113374/810109Es posible que el navegador no pueda detectar que su formulario es un formulario de inicio de sesión. De acuerdo con parte de la discusión en esta pregunta anterior , un navegador busca campos de formulario similares
<input type="password">
. ¿Su campo de formulario de contraseña implementado es similar a eso?Editar: para responder a sus preguntas a continuación, creo que Firefox detecta las contraseñas
form.elements[n].type == "password"
(iterando a través de todos los elementos del formulario) y luego detecta el campo del nombre de usuario buscando hacia atrás a través de los elementos del formulario para el campo de texto inmediatamente antes del campo de la contraseña (más información aquí ). Por lo que puedo decir, su formulario de inicio de sesión debe ser parte de<form>
o Firefox no lo detectará.fuente
Enfoque simple 2020
Esto habilitará automáticamente el autocompletado y guardará la contraseña en los navegadores.
autocomplete="on"
(formar)autocomplete="username"
(entrada, correo electrónico / nombre de usuario)autocomplete="current-password"
(contraseña de entrada)Vea más en la documentación de Apple: Habilitación de Autocompletar contraseña en un elemento de entrada HTML
fuente
preventDefault
) y no funcionará si solo hay un campo de contraseña (aplicaciones de tipo digital-seguro). Compartir estos hallazgos para cualquier otra persona que pueda encontrarlo útil.Pasé mucho tiempo leyendo las diferentes respuestas en este hilo, y para mí, en realidad, era algo ligeramente diferente (relacionado, pero diferente). En Mobile Safari (dispositivos iOS), si el formulario de inicio de sesión está OCULTADO cuando se carga la página, el mensaje no aparecerá (después de mostrar el formulario y luego enviarlo). Puede probar con el siguiente código, que muestra el formulario 5 segundos después de la carga de la página. Retire el JS y la pantalla: ninguno y funciona. Todavía tengo que encontrar una solución a esto, solo publicado en caso de que alguien más tenga el mismo problema y no pueda descubrir la causa.
JS:
HTML:
fuente
Ninguna de las respuestas ya deja en claro que puede usar la API de historial HTML5 para solicitar que se guarde la contraseña.
Primero, debe asegurarse de tener al menos un
<form>
elemento con una contraseña y un campo de correo electrónico o nombre de usuario. La mayoría de los navegadores manejan esto automáticamente siempre que use los tipos de entrada correctos (contraseña, correo electrónico o nombre de usuario). Pero para estar seguro, configure los valores de autocompletar correctamente para cada elemento de entrada.Puede encontrar una lista de los valores de autocompletar aquí: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
Los que necesita son:
username
,email
ycurrent-password
Entonces tienes dos posibilidades:
También puede cambiar la URL de la página, pero eso no es necesario para solicitar que guarde la contraseña:
Documentación: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState
Esto tiene el beneficio adicional de que puede evitar que el navegador solicite guardar la contraseña si el usuario la ingresó incorrectamente. Tenga en cuenta que en algunos navegadores el navegador siempre le pedirá que guarde las credenciales, incluso cuando llame a .preventDefault y no use la API de historial.
Si no desea navegar y / o modificar el historial del navegador, puede usar replaceState en su lugar (esto también funciona).
fuente
history.pushState({}, null "Your new page title");
para cambiar la URL sin ninguna navegaciónEl siguiente código se prueba en
JS-Fiddle:
http://jsfiddle.net/ocozggqu/
Código postal:
Observaciones
window.external.AutoCompleteSaveForm
se necesita una llamada aAquí hay un ejemplo de código de inicio de sesión ajax:
Observaciones
fuente
Encontré una solución bastante elegante (o pirateo, lo que sea apropiado) para los usuarios de Prototype.JS, siendo uno de los últimos holdouts con Prototype. Una simple sustitución de los métodos jQuery correspondientes debería ser suficiente.
Primero, asegúrese de que haya una
<form>
etiqueta y un botón de envío con un nombre de clase al que se pueda hacer referencia más adelante (en este casofaux-submit
) que esté anidado dentro de un elemento con un estilo establecidodisplay:none
, como se ilustra a continuación:Luego cree un observador de clics para el
button
, que "enviará" el formulario como se ilustra:Luego cree un oyente para el
submit
evento y deténgalo.event.stop()
detendrá todos los eventos de envío en el DOM a menos que esté envueltoEvent.findElement
con la clase del botón de entrada oculto (como arribafaux-submit
):Esto se prueba como funcionando en Firefox 43 y Chrome 50.
fuente
Probablemente su sitio ya esté en la lista donde se le dice al navegador que no solicite guardar una contraseña. En firefox, Opciones -> Seguridad -> Recordar contraseña para sitios [casilla de verificación] - excepciones [botón]
fuente
agregue un poco más de información a la respuesta de @Michal Roharik.
si su llamada ajax devolverá una url de retorno, debe usar jquery para cambiar el atributo de acción de formulario a esa url antes de llamar a form.submit
ex.
fuente
Tuve un problema similar, el inicio de sesión se realizó con ajax, pero los navegadores (firefox, chrome, safari e IE 7-10) no ofrecerían guardar la contraseña si el formulario (#loginForm) se envía con ajax.
Como SOLUCIÓN , agregué una entrada de envío oculta (#loginFormHiddenSubmit) al formulario que envió ajax y, después de que la llamada ajax devolviera el éxito, activaría un clic para ingresar la entrada oculta. La página de cualquier manera necesitaba actualizarse. El clic se puede activar con:
La razón por la que agregué el botón de envío oculto es porque:
no ofrecería guardar la contraseña en IE (aunque ha funcionado en otros navegadores).
fuente
No todos los navegadores (por ejemplo, IE 6) tienen opciones para recordar credenciales.
Una cosa que puede hacer es (una vez que el usuario inicia sesión con éxito) almacenar la información del usuario a través de cookies y tener la opción "Recordarme en esta máquina". De esa manera, cuando el usuario vuelve (incluso si ha cerrado la sesión), su aplicación web puede recuperar la cookie y obtener la información del usuario (ID de usuario + ID de sesión) y permitirle continuar trabajando.
Espero que esto pueda ser sugerente. :-)
fuente
useful garbage
para identificar la información del usuario. Incluso SO almacena información en cookies para reconocerte.La verdad es que no puedes obligar al navegador a preguntar. Estoy seguro de que el navegador tiene su propio algoritmo para adivinar si ha ingresado un nombre de usuario / contraseña, como buscar una entrada de
type="password"
pero no puede configurar nada para forzar el navegador.Como otros sugieren, podría agregar información de usuario en una cookie. Si hace esto, es mejor que lo cifre al menos y no almacene su contraseña. Quizás almacene su nombre de usuario como máximo.
fuente
Puede adjuntar el cuadro de diálogo al formulario, por lo que todas esas entradas están en un formulario. La otra cosa es hacer el campo de texto de contraseña justo después del campo de texto de nombre de usuario.
fuente
Esto funciona mucho mejor para mí, porque está 100% ajaxed y el navegador detecta el inicio de sesión.
fuente
Usar una cookie probablemente sería la mejor manera de hacerlo.
Podría tener una casilla de verificación para "¿Recordarme?" y haga que el formulario cree una cookie para almacenar la // información de inicio de sesión del usuario //. EDITAR: Información de sesión de usuario
Para crear una cookie, deberá procesar el formulario de inicio de sesión con PHP.
fuente