firefox - sirve - ¿Cómo sabe el navegador cuándo solicitarle al usuario que guarde la contraseña?
perfiles firefox (13)
Esto está relacionado con la pregunta que hice aquí: ¿Cómo puedo hacer que el navegador solicite guardar la contraseña?
Este es el problema: NO PUEDO que mi navegador me pida que guarde la contraseña para el sitio que estoy desarrollando. (Estoy hablando de la barra que aparece a veces cuando envías un formulario en Firefox, que dice "¿Recuerdas la contraseña de yoursite.com? Sí / No ahora / Nunca")
Esto es súper frustrante porque esta característica de Firefox (y la mayoría de los otros navegadores modernos, que espero funcionen de manera similar) parece ser un misterio. Es como un truco de magia que hace el navegador, donde mira su código, o lo que envía, o algo así, y si se ve como un formulario de inicio de sesión con un campo de nombre de usuario (o dirección de correo electrónico) y una contraseña, ofrece ahorrar.
Excepto en este caso, donde no está ofreciendo a mis usuarios esa opción después de que usan mi formulario de inicio de sesión, y me está volviendo loco. :-)
(Comprobé la configuración de Firefox-- NO le he dicho al navegador "nunca" para este sitio. Debería ser una sugerencia).
Mi pregunta
¿Cuáles son las heurísticas que utiliza Firefox para saber cuándo debe solicitar al usuario que guarde? Esto no debería ser demasiado difícil de responder, ya que está ahí en la fuente de Mozilla (no sé dónde buscar o intentaré desenterrarlo). Tampoco he tenido suerte al encontrar una publicación de blog o alguna otra nota similar de desarrollador de Mozilla sobre esto.
(Estoy de acuerdo con que esta pregunta sea respondida para Safari o IE; me imagino que todos los navegadores usan reglas muy similares, así que si puedo hacerlo funcionar en una de ellas, funcionará en las demás).
(* Tenga en cuenta que si su respuesta a mí tiene algo que ver con las cookies, el cifrado o cualquier otra información sobre cómo estoy almacenando las contraseñas en mi base de datos local, es muy probable que haya malinterpretado mi pregunta. :-)
Además de mucho de lo que ya se ha dicho, me di cuenta de que los campos de entrada no deben estar "deshabilitados". Tuvimos un inicio de sesión de varios pasos que primero solicita el nombre de usuario y luego, en la siguiente pantalla, la contraseña. En esa segunda pantalla, repetimos el correo electrónico, pero lo desactivamos y eso impidió que Chrome et. Alabama. de reconocer como un campo válido para el nombre de usuario.
Como realmente queríamos mantener ese campo de entrada inhabilitado, terminamos con esta solución hacky:
<input type="text" name="display-username" id="display-username" value="ENTERED_USERNAME" placeholder="Username" disabled="disabled">
<input type="text" name="username" id="username" value="ENTERED_USERNAME" placeholder="Username" style="display: none;">
<input type="password" name="password" id="password" value="" autofocus="autofocus" autocomplete="on" placeholder="Password" required="required">
No iría tan lejos para recomendar esto, pero tal vez señala a alguien a algo en su propio código:
- El primer elemento muestra el nombre de usuario en un campo de entrada deshabilitado. Disabled no se envía como parte del formulario y el navegador no reconoce la opción deshabilitada.
- El segundo elemento es un campo de entrada apropiado, con type = "text" y name / id = "username". Esto está siendo reconocido por el navegador. Para evitar que el usuario lo edite lo ocultamos con CSS (display: none).
Bueno, en nuestro sitio , un campo de formulario con el nombre "nombre de usuario" escriba "texto" seguido inmediatamente de un campo con el nombre "contraseña" y escriba "contraseña" parece ser el truco.
Debería consultar la página de depuración de Mozilla Password Manager y los documentos de nsILoginManager para los redactores de extensiones (solo para conocer los detalles técnicos básicos de cómo trata Firefox la administración de contraseñas). Puede profundizar en las respuestas allí y en otras páginas vinculadas allí para descubrir más de lo que probablemente nunca quiso saber cómo interactúa el administrador de contraseñas con los sitios y las extensiones.
(Específicamente, como se señala en el documento de depuración del administrador de contraseñas, asegúrese de que no se haya desactivado la función de autocompletar en su html, ya que eso suprimirá la solicitud para guardar el nombre de usuario y la contraseña)
Esto parece funcionar para Firefox, Chrome y Safari en Mac. No probado en Windows.
<form id="bridgeForm" action="#" target="loginframe" autocomplete="on">
<input type="text" name="username" id="username" />
<input type="password" name="password" id="password"/>
</form>
<iframe id="loginframe" name="loginframe" src="anyblankpage.html"></iframe>
Esto necesita ser agregado a la página. No se puede agregar dinámicamente. El formulario y el iframe se pueden configurar para mostrar: ninguno. Si no configuras el src del iframe, el aviso no se mostrará hasta que hayas enviado el formulario al menos una vez.
Luego llame al formulario submit ():
bridgeForm.submit();
La acción puede ser opcional y la autocompleta puede ser opcional. No lo he probado.
Nota : En algunos navegadores, el formulario debe ejecutarse en un servidor (no localhost y no el sistema de archivos) antes de que el navegador responda.
Así que esto:
http://www.mysite.com/myPage.html
no esta:
http://126.0.0.1/myPage.html
http://localhost/myPage.html
file://directory/myPage.html
Funciona para mí con angular, Chrome, Firefox: (He buscado y probado durante horas - para Chrome el parámetro de acción de forma ( #
) fue la respuesta. @ 1.21 gigavatios , ¡gracias! Tu respuesta fue invaluable).
formar
Firefox 30.0: no necesita un botón de iframe oculto y de envío (como se muestra a continuación), pero necesita la directiva "login-form-autofill-fix" para reconocer los credenciales de autocompletar, de la siguiente manera:
<form name="loginForm" login-form-autofill-fix action="#" target="emptyPageForLogin" method="post" ng-submit="login({loginName:grpEmail,password:grpPassword})">
<input type="text" name=username" id="username" ng-model="grpEmail"/>
<input type="password" name="password" id="password" ng-model="grpPassword"/>
<button type="submit">Login</button>
</form>
iframe escondido
Chrome 35.0: no necesita la directiva anterior, pero necesita un iframe oculto y un botón de enviar en la forma real. El iframe oculto se ve como
<iframe src="emptyPageForLogin.html" id="emptyPageForLogin" name="emptyPageForLogin" style="display:none"></iframe>
directiva angular (usando jqLite)
Esto funciona con angular 1.2.18
module.directive(''loginFormAutofillFix'', function() {
return function(scope, elem, attrs) {
if(!attrs.ngSubmit) {
return;
}
setTimeout(function() {
elem.unbind("submit").bind("submit", function(e) {
//DO NOT PREVENT! e.preventDefault();
elem.find("input").triggerHandler("input");
scope.$apply(attrs.ngSubmit);
});
}, 0);
});
enmienda
- después de algunas pruebas, me di cuenta de que Chrome necesita un poco de tiempo de espera por el método de inicio de sesión angular (200 ms); parece que el redireccionamiento a veces es demasiado rápido para el administrador de contraseñas.
- mejor browsercache claro ... con cada cambio
La palabra clave principal está aquí,
<input type="password">
Las heurísticas son bastante simples aquí: detectar campos con ciertos nombres en cierto orden. Cuáles, no puedo decirlo, pero esto funcionó bien para mí en Chrome e IE:
Username field: name "login", type "text";
Password field: name "password", type "password"
Submit button: element "input", type "submit".
Element "button" type "submit" did not work.
Recomiendo mirar el código fuente de Firefox . En realidad, es un código bastante sencillo.
Los métodos que desea ver son _onFormSubmit
, _getFormFields
y _getPasswordFields
.
Incluso puede encontrar que el problema que está teniendo es de hecho un error no descubierto en Firefox;) https://bugzilla.mozilla.org/show_bug.cgi?id=1211780
Si está utilizando el inicio de sesión de AJAX, eche un vistazo a ese código fuente: https://gist.github.com/968927
Consiste en enviar un formulario de inicio de sesión a un iframe oculto, para que IE y Chrome puedan detectar el inicio de sesión real, sin tener que volver a cargar la página.
Si tiene, por ejemplo, dos tipos = texto en su formulario antes de ingresar tipo = contraseña, el navegador detecta el tipo de entrada más cercano = texto para su nombre de usuario.
Esta no es la materia que tiene otra entrada es = nombre de usuario y nombre = nombre de usuario
para resolver este problema, debe ingresar su nombre de usuario que desea guardar exactamente antes de su contraseña de entrada
Buena suerte :-)
También noté que Chrome no ofrecerá recordar una contraseña si el formulario de inicio de sesión aún está presente después de la solicitud de inicio de sesión, incluso si está oculto en la página.
Supongo que cree que la acción de inicio de sesión falló y, por lo tanto, se niega a almacenar credenciales no válidas.
Visto en Chrome 34.0.
Tuve el mismo problema y encontré una solución:
para hacer que el navegador solicite que se guarden los cuadros de contraseña, nombre de usuario y contraseña deben estar en un formulario y ese formulario debe ser enviado. El botón de enviar podría devolver falso desde el manejador onclick (por lo que el envío no ocurre en realidad).
para que el navegador restaure la contraseña previamente almacenada, los cuadros de entrada deben existir en el formulario HTML principal y no deben crearse a través de javascript dinámicamente. El formulario se puede crear con display: ninguno.
Es necesario tener en cuenta que la contraseña se llena inmediatamente después de que la página se carga y está presente allí durante toda la sesión, por lo que se puede leer mediante javascript inyectado: empeora los ataques. Para evitar esto, reenviar a una página separada solo para iniciar sesión es razonable, y resuelve todos los problemas para los que comenzó a leer este tema :). Como solución parcial borro los campos al enviar el formulario; si el usuario cierra la sesión y desea iniciar sesión de nuevo, el navegador no completa la contraseña, pero eso es menor para mí.
Viliam
Basado en lo que he leído, creo que Firefox detecta las contraseñas por form.elements[n].type == "password"
(iterando a través de todos los elementos del formulario) y luego detecta el campo de nombre de usuario buscando hacia atrás elementos de formulario para el campo de texto inmediatamente antes del campo de contraseña (más información here ). Puede intentar algo similar en Javascript y ver si puede detectar su campo de contraseña.
Por lo que puedo decir, su formulario de inicio de sesión debe ser parte de una <form>
o Firefox no lo detectará. Establecer id="password"
en su campo de contraseña probablemente tampoco podría perjudicar.
Si esto todavía le da muchos problemas, le recomendaría que pregunte en una de las listas de correo de desarrolladores del proyecto Mozilla (incluso podría obtener una respuesta del desarrollador que diseñó la característica).