Это связано с вопросом, который я задал здесь: как заставить браузер запрашивать сохранение пароля?
Это проблема: я НЕ МОГУ заставить свой браузер предлагать мне сохранить пароль для сайта, который я разрабатываю. (Я говорю о панели, которая иногда появляется, когда вы отправляете форму в Firefox, которая говорит: «Запомнить пароль для yoursite.com? Да / Не сейчас / Никогда»)
Это очень неприятно, потому что эта функция Firefox (и большинства других современных браузеров, которые, я надеюсь, работают аналогичным образом) кажется загадкой. Это похоже на волшебный трюк, который выполняет браузер, когда он смотрит на ваш код, или то, что вы отправляете, или что-то в этом роде, и если он "выглядит" как форма входа в систему с полем имени пользователя (или адреса электронной почты) и полем пароля, он предлагает сохранить.
За исключением этого случая, когда он не предлагает моим пользователям такой вариант после того, как они используют мою форму входа, и это сводит меня с ума. :-)
(Я проверил свои настройки Firefox - я НЕ сказал браузеру «никогда» для этого сайта. Он должен выдавать запрос.)
Мой вопрос
Какие эвристики использует Firefox, чтобы узнать, когда он должен предложить пользователю сохранить? На этот вопрос не должно быть слишком сложно ответить, поскольку он прямо в исходном коде Mozilla (я не знаю, где искать, иначе я бы попытался откопать его сам). Мне также не удалось найти сообщение в блоге или другое подобное примечание от разработчиков Mozilla по этому поводу.
(Меня бы устроило, если бы на этот вопрос ответили для Safari или IE; я бы предположил, что все браузеры используют очень похожие правила, поэтому, если я смогу заставить его работать в одном из них, он будет работать и в других.)
(* Обратите внимание, что если ваш ответ мне имеет какое-либо отношение к файлам cookie, шифрованию или чему-либо еще, касающемуся того, как я храню пароли в моей локальной базе данных, велика вероятность, что вы неправильно поняли мой вопрос. :-)
Ответы:
Основываясь на том, что я прочитал, я думаю, что Firefox обнаруживает пароли
form.elements[n].type == "password"
(итерация по всем элементам формы), а затем обнаруживает поле имени пользователя, выполняя поиск назад по элементам формы для текстового поля непосредственно перед полем пароля (подробнее здесь ). Вы можете попробовать что-то подобное в Javascript и посмотреть, сможете ли вы определить поле своего пароля.Насколько я могу судить, ваша форма входа должна быть частью a,
<form>
иначе Firefox ее не обнаружит. Установкаid="password"
в поле пароля, вероятно, тоже не повредит.Если это по-прежнему вызывает у вас много проблем, я бы порекомендовал задать вопрос в одном из списков рассылки разработчиков проекта Mozilla (вы даже можете получить ответ от разработчика, создавшего эту функцию).
источник
У меня была такая же проблема, и я нашел решение:
чтобы браузер запрашивал пароль, поля для имени пользователя и пароля должны быть в форме, и эта форма должна быть фактически отправлена. Кнопка отправки может вернуть false из обработчика onclick (поэтому на самом деле отправка не происходит).
чтобы браузер восстановил ранее сохраненный пароль, поля ввода должны существовать в основной HTML-форме, а не создаваться динамически с помощью javascript. Форма может быть создана с отображением: нет.
Следует отметить, что пароль заполняется сразу после загрузки страницы и присутствует там в течение всего сеанса, поэтому его можно прочитать с помощью внедренного javascript: это значительно усугубляет такие атаки. Чтобы этого избежать, переадресация на отдельную страницу просто для входа в систему является разумной, и это решает все проблемы, о которых вы начали читать эту тему :). В качестве частичного решения я очищаю поля при отправке формы - если пользователь выходит из системы и хочет снова войти в систему, пароль не заполняется браузером, но для меня это второстепенно.
Вильям
источник
return false
илиevent.preventDefault()
это не будет работать в Chrome из-за этой ошибки: code.google.com/p/chromium/issues/detail?id=282488Вам следует взглянуть на страницу отладки Менеджера паролей Mozilla и документацию nsILoginManager для разработчиков расширений (просто для мельчайших технических деталей того, как Firefox работает с управлением паролями). Вы можете покопаться в ответах там и на других связанных с ними страницах, чтобы узнать больше, чем вы, вероятно, когда-либо хотели знать, как менеджер паролей взаимодействует с сайтами и расширениями.
(В частности, как указано в отладочной документации диспетчера паролей, убедитесь, что в вашем html не отключено автозаполнение, так как это подавит запрос на сохранение имени пользователя и пароля)
источник
Кажется, это работает для Firefox, Chrome и Safari на Mac. Не тестировалось в Windows.
Это нужно добавить на страницу. Его нельзя добавить динамически. Для формы и iframe можно настроить отображение: нет. Если вы не установите src iframe, приглашение не будет отображаться, пока вы не отправите форму хотя бы один раз.
Затем вызовите форму submit ():
Действие может быть необязательным, а автозаполнение - необязательным. Не тестировал.
Примечание . В некоторых браузерах форма должна быть запущена на сервере (не локальном хосте и не в файловой системе), прежде чем браузер ответит.
Итак, это:
http://www.mysite.com/myPage.html
не этот:
http://126.0.0.1/myPage.html
http://localhost/myPage.html
file://directory/myPage.html
источник
iframe
обходных путей больше не требуется. См stackoverflow.com/a/33113374/810109У меня работает с angular, chrome, firefox: (Я искал и тестировал несколько часов - для chrome
#
был ответом параметр действия формы ( ). @ 1,21 гигаватт , спасибо !!! Ваш ответ был бесценным.)форма
firefox 30.0 - не требуется скрытый iframe и кнопка отправки (как показано ниже), но требуется директива "login-form-autofill-fix" для распознавания автозаполненных учетных данных, как показано ниже:
скрытый iframe
chrome 35.0 - не нужна указанная выше директива, но нужен скрытый iframe и кнопка отправки в реальной форме. Скрытый iframe выглядит так
угловая директива (с использованием jqLite)
Это работает с angular 1.2.18
поправка
источник
iframe
обходных путей больше не требуется. См stackoverflow.com/a/33113374/810109Что ж, на нашем сайте поле формы с именем «имя пользователя» типа «текст», сразу за которым следует поле с именем «пароль» и типом «пароль», похоже, помогает.
источник
Если вы используете вход AJAX, взгляните на этот исходный код: https://gist.github.com/968927
Он состоит из отправки формы входа в скрытый iframe, чтобы IE и Chrome могли определить фактический вход без необходимости перезагружать страницу.
источник
iframe
обходных путей больше не требуется. См stackoverflow.com/a/33113374/810109Эвристика здесь довольно проста: обнаружение полей с определенными именами в определенном порядке. Какие, я не могу сказать, но у меня это отлично сработало в Chrome и IE:
источник
<button type="submit">
на,<input type="submit">
чтобы Dashlane заработал. Не могу поверить, что это вообще вещь ...Я также заметил, что Chrome не предлагает запомнить пароль, если форма входа все еще присутствует после запроса входа, даже если она скрыта на странице.
Я предполагаю, что он считает, что действие входа не удалось, и поэтому отказывается хранить недопустимые учетные данные.
Встречается в Chrome 34.0.
источник
Я бы рекомендовал посмотреть исходный код Firefox . На самом деле это довольно простой код.
Методы , которые вы хотите посмотреть на это
_onFormSubmit
,_getFormFields
и_getPasswordFields
.Возможно, вы даже обнаружите, что проблема заключается в необнаруженной ошибке в Firefox;) https://bugzilla.mozilla.org/show_bug.cgi?id=1211780
источник
В дополнение ко многому, о чем уже было сказано, я понял, что поля ввода нельзя «отключать». У нас был многоэтапный вход в систему, который сначала запрашивает имя пользователя, а затем, на следующем экране, пароль. На этом втором экране мы повторили письмо, но отключили его, и это помешало Chrome et. al. от распознавания действительного поля для имени пользователя.
Поскольку мы действительно хотели сохранить отключенное поле ввода, мы пришли к следующему обходному пути:
Я бы не стал так далеко рекомендовать это, но, возможно, это указывает кому-то на что-то в их собственном коде:
источник
Если у вас есть, например, два type = text в вашей форме перед input type = password, браузер определит ближайший тип input = text для вашего имени пользователя.
Это не имеет значения, что другой вход имеет = имя пользователя и имя = имя пользователя
для решения этой проблемы вы должны ввести свое имя пользователя, которое вы хотите сохранить, точно перед вводимым паролем
Удачи :-)
источник
Главное ключевое слово здесь,
источник