Защита от дурака. Защита от дурака Настройте приложение для идентификации

26.06.2020 Звуковые устройства

Почему мне установили эту форму

В настоящий момент на ваш сайт проводится Brute-force атака. Brute-force атака — это атака по подбору паролей. В данном случае происходит подбор пароля к административной панели вашего сайта.

Чтобы не допустить взлома вашего сайта и повысить его безопасность, нами была установлена дополнительная защита.

Как я теперь могу получить доступ к админ-панели сайта

Теперь при доступе к административной панели вашего сайта (на Joomla или WordPress) будет появляться дополнительное окно ввода логина и пароля с надписью «please use your control panel password». В качестве логина необходимо ввести логин вашей услуги хостинга, он имеет вид «u1234567» . В качестве пароля — текущий пароль к вашей услуге хостинга.

После прохождения базовой HTTP-аутентификации перед вами откроется стандартное поле для авторизация в админ-панели вашего сайта. Теперь уже вам нужно будет ввести логин и пароль администратора сайта.

Как работает базовая HTTP-аутентификация

При вводе логина-пароля в окно базовой аутентификации значение логина и хеша пароля будут сравниваться со значениями в специальном файле ~/etc/users , доступным в панели управления хостингом. Содержимое файла выглядит примерно так: «u1234567:dm48bspxIO3rg» . Где «u1234567» — логин, а «dm48bspxIO3rg» — хеш пароля (обратите внимание: только хеш, а не сам пароль!). Хеш пароля — это результат преобразование пароля по определенному алгоритму.

Таким образом, когда вы вводите логин и пароль в окно базовой аутентификации, от введённого пароля берётся хеш и сравнивается со значением хеша в файле ~/etc/users . Если значения совпадают, вы проходите аутентификацию.

У меня не получается пройти базовую аутентификацию

Вероятно, вы вводите неверный пароль. Установите новый пароль для базовой аутентификации:

Если вы прошли базовую аутентификацию но не можете войти непосредственно в админ-панель сайта Joomla или WordPress, воспользуйтесь справкой:

Как повысить защиту сайта от Brute-force атак?

Для повышения защиты сайта:

  • измените логин суперпользователя на более уникальный. Не используйте короткие имена, лучше если вы будете использовать имя вместе с фамилией. В сети Интернет есть множество ресурсов где собраны наиболее популярные логины. Ознакомьтесь с ними и никогда не используйте их;
  • установите сложный пароль администратора сайта. Сложный пароль должен содержать буквы верхнего и нижнего регистра, цифры и дополнительные символы, такие как «* — _ # :» и т.д. Длина пароля — никак не меньше 6 символов. Желательно от 10 и выше.

Как убрать форму базовой HTTP-аутентификации?

Чтобы убрать форму базовой HTTP-аутентификации:

AuthType Basic AuthName "please use your control panel password" AuthUserFile .../users Require valid-user

Для комментирования строки поставьте символ решётки («#») в начало строки, вот так.

«Защитой от дурака» называется комплекс мер по пресечению ввода неправильной информации в форме. Например, если в поле требуется ввести положительное число от 0 до 10, то следует проверить, чтобы пользователь не ввёл текст или число, которое не лежит в указанном диапазоне, т.е. число не должно быть меньше нуля и больше десяти.

Почему происходит ввод неправильной информации? Это в основном совершается по трём причинам.

  1. Пользователь ошибся случайно, например, невнимательно прочитал, что ему требуется указать.
  2. На веб-странице неоднозначно просят ввести данные, поэтому пользователю приходится гадать и делать предположение, что же в действительности от него хотят. При этом не всегда происходит совпадение мнений разработчика и пользователя.
  3. Есть ряд людей, которые воспринимают инструкции как вызов и стараются поступить наоборот. Такие пользователи рассуждают примерно так: «Ага, меня просят ввести число. А что будет, если я укажу буквы?». После чего задают явно неправильную информацию и смотрят, к чему это приведёт.

Следует понимать, что точные и правильные формулировки хотя и снижают вероятность возникновения ошибок, но никак не спасают от них. Только технические средства на стороне сервера позволяют получить требуемый результат и избежать ввода неправильной информации. Тем не менее, ревизия или, как её ещё называют, валидация на стороне клиента позволяет быстро проверить данные, вводимые пользователем, на корректность, без отправки формы на сервер. Таким образом экономится время пользователя и снижается нагрузка на сервер. С позиции юзабилити тоже имеются плюсы - пользователь сразу получает сообщение о том, какую информацию он указал неверно и может исправить свою ошибку.

Обязательное поле

Некоторые поля формы должны быть обязательно заполнены перед их отправкой на сервер. Это, к примеру, относится к форме регистрации, где требуется ввести логин и пароль. Для указания обязательных полей используется атрибут required , как показано в примере 1.

Пример 1. Атрибут required

HTML5 IE 10+ Cr Op Sa Fx

Обязательное поле

Логин:

Пароль:

Обязательные поля должны быть заполнены перед отправкой формы, иначе форма на сервер не отправится и браузер выдаст об этом предупреждение. Вид сообщения зависит от браузера, например Chrome выводит всплывающую подсказку, как показано на рис. 1.

Рис. 1. Обязательное поле не заполнено

Корректность данных

Исходно имеется два поля, в котором вводимые пользователем данные проверяются автоматически. Это веб-адрес и адрес электронной почты. Браузер Chrome также проверяет на корректность поле с календарными данными, но только потому, что у него не предусмотрен интерфейс выбора календаря щелчком мыши. Для этих элементов характерны следующие правила.

  • Веб-адрес ( ) должен содержать протокол (http://, https://, ftp://).
  • Адрес электронной почты ( ) должен содержать буквы или цифры до символа @, после него, затем точку и домен первого уровня.

У браузеров несколько различается политика по проверке данных пользователя. К примеру, Opera подставляет протокол http:// перед введённым текстом автоматически, тогда как другие браузеры ждут его от пользователя. Chrome и Opera требуют, чтобы в почтовом адресе была точка, для Firefox она не обязательна.

В примере 2 показана форма с обязательными полями, в которой два поля проверяется браузером.

Пример 2. Корректность данных

HTML5 IE 10+ Cr Op Sa Fx

Корректность данных

Заполните форму (все поля обязательны)

Имя:

Email:

Сайт:

Opera проверяет элемент формы только при наличии атрибута name.

Что происходит в Opera при вводе неверных данных показано на рис. 2.

Рис. 2. Предупреждение о неправильных данных

Шаблон ввода

Некоторые данные нельзя отнести к одному из видов элементов формы, поэтому для них приходится использовать текстовое поле. При этом их ввод происходит по определённому стандарту. Так, IP-адрес содержит четыре числа разделённых точкой (192.168.0.1), почтовый индекс России ограничен шестью цифрами (124007), телефон содержит код города и конкретное количество цифр часто разделяемых дефисом (391 555-341-42) и др. Браузеру необходимо указать шаблон ввода, чтобы он согласно нему проверял вводимые пользователем данные. Для этого используется атрибут pattern , а его значением выступает регулярное выражение . Некоторые типовые значения перечислены в табл. 1.

В примере 3 просят ввести шестнадцатеричное значение цвета (#ffcc00) и если оно не лежит в этом диапазоне, браузер выводит сообщение об ошибке.

Пример 3. Шаблон ввода

HTML5 IE 10+ Cr Op Sa Fx

Ввод цвета

Введите шестнадцатеричное значение цвета (должно начинаться с #)

На рис. 3 показано предупреждение в браузере Chrome.

Рис. 3. Введённые данные не соответствуют шаблону

Отмена валидации

Валидация не всегда требуется для формы, к примеру, разработчик пожелает использовать универсальное решение на JavaScript и дублирующая проверка браузером ему уже ни к чему. В подобных случаях необходимо отключить встроенную валидацию. Для этого применяется атрибут novalidate тега

. В примере 4 показано использование этого атрибута.

Пример 4. Отмена валидации

HTML5 IE 10+ Cr Op Sa Fx

Атрибут novalidate

Для аналогичной цели применяется и атрибут formnovalidate , который добавляется к кнопке для отправки формы, в данном случае к тегу . В этом случае форма из примера 4 будет иметь следующий вид.

В последнее время Instagram начал частить с нововведениями. А любые обновления в Инстаграм обычно сопровождаются массовыми глюками и проблемами в работе сети. Это настолько привычный процесс, что я какое-то время не обращал внимание на самую главную ошибку последних недель: «Извините, произошла ошибка».

В последнее время распространён другой тип такой же ошибки, когда Instagram не пишет никаких проблем, но вы всё равно не можете зайти в свой аккаунт.

В статье я собрал все известные варианты решения проблемы со входом Insta-аккаунта на телефоне. Погнали.

Решения проблемы «Oops, an error occurred» в Instagram

Вариант 0.

Воспользуйтесь другим телефоном. Скорее всего вам это не поможет, но маленький шанс есть. Самая большая вероятность, что этот способ поможет — взять телефон, на котором вы ранее уже успели войти в свой Insta-аккаунт. Очень часто проблема связана с тем, что Instagram «вам как бы не верит». Поэтому и шансы со старого телефона выше.

Вариант 1.

Первое, что вам стоит сделать - попытаться зайти в Instagram с помощью Facebook. Очевидно, что такое способ подойдёт только в случае, когда вы заранее сделали привязку Facebook к Instagram. Сани готовим летом, так ведь? Связка двух сетей крайне полезна не только самому Фейсбуку, который сможет лучше таргетировать на вас рекламу и зарабатывать дополнительные миллиарды долларов, но и обезопасит ваш аккаунт от угона и… И позволит вам войти в ваш профиль, если вы поймали ошибку «Извините, произошла ошибка».

Ещё раз. Вы получили подобную ошибку - пробуйте авторизироваться через привязанный к Insta-аккаунту Facebook профиль. Лично мне сегодня именно этот вариант помог и я вошёл в один из своих профилей.

Вариант 2.

Всё хорошо, но что делать, если аккаунты в Instagram и Facebook вы не связали? И тут я могу начать читать вам лекции о важности безопасности и всей подобной чуши, напомнить ситуацию с бэкапами, о которых никто не задумывается до момента, когда он понадобится. Только к чему? Решаем проблемы по мере их поступления.

При проблеме «Извините, произошла ошибка» вы можете зайти в web-версию в Instagram, но она не позволяет нам привязать Facebook. Поэтому ленту полистать, конечно можно, но ничем большим она нам не поможет.

Самое время вспомнить о . Если вы не знали, то пользоваться Direct’ом на ноутбуке (только если у вас не Mac) можно уже давно и без танцев с бубном. Выглядит программа вот так:

В Instagram под Windows 10 авторизироваться получается без проблем, даже если ваш аккаунт и словил известную ошибку. Проверял на трёх проблемных профилях и все смогли войти. Да, выборка не самая обширная, поэтому если у вас вдруг возникнет с этим проблема - напишите о ней в комментариях к статье, если вам не трудно.

После того, как мы вошли в свой аккаунт с помощью приложения под «винду», мы бежим читать директ и отвечать всем клиентам, а уже потом идём в настройки и ищем пункт «Друзья на Facebook». Подключаем свой профиль в Facebook, немного ждём, поздравляю, проблема практически решена.

Дрожащими, от счастья и предвкушения, руками, берём телефон и нажимаем на заветную кнопку Войти с помощью Facebook.

Помогает в большинстве случаев, но увы не всем. Разбираемся дальше.

Альтернативный вариант.

У части пользователей отсутствует возможность воспользоваться клиентом для Windows 10, либо такой способ не подошёл. Читатели в комментариях поделились ещё одним способом: скачивает любой VPN-клиент для телефона, открываем с помощью него Instagram с выбором страны (в VPN-приложении) из сопредельных развитых стран (Германия и так далее). Когда Instagram нас запустил, привязываем Facebook к профилю, проблема решена.

Важно! VPN может только усугубить проблему, словить подтверждение профиля по СМС без возможности логина.

Вариант 3.

Следующие действия немного походят на танцы индейцев, которые пытались ими вызвать дождь. Иногда совпадало, что ещё больше убеждало индейцев в том, что есть некий правильный ритуал и порядок действий, благодаря чему можно прекращать засухи. Ну и танцевали они, пока Колумб материком не ошибся. Что-то я увлёкся.

Возвращаемся в веб-версию Инстаграм. Предвосхищая вопрос, да, она существует и находится по адресу Instagram.com . Авторизируемся, заходим в настройки и внизу замечаем строчку «Временно заблокировать мой аккаунт». Смело нажимаем, не волнуйтесь, профиль не исчезнет. Цукерберг так просто своего пользователя не отпустит:)

Далее выбираем «проблемы с входом», из-за чего хотите совершить святотатство и отказаться на время от Инстаграм, соглашаетесь и блокируете. Дальше можно наконец-то пообщаться со своими домашними, выгулять собаку и даже выпить пенного. Ближайшие 2-3 часа аккаунт вы не трогаете, как бы этого не хотелось.

Возвращается аккаунт из временной блокировки только с помощью логина в приложении. Который будет успешным. Не до конца понимаю механику этой магии, но работают у подавляющего большинства пользователей, столкнувшихся с проблемой.

Вариант 4.

Поздравляю, вы избранный, раз прошлые способы вам не подошли. Итак, на экране авторизации ищем слабозаметную надпись «помощь со входом». На следующем экране выбираем верхний вариант, который не до конца влезает в экран.

Там вписываем адрес электронной почты, на которую зарегистрирован аккаунт и выбираем «Отправить электронное письмо». Проверяем почту, находим следующий конвертик:

Это очень важное письмо! Тут внимательно. Нажимаем на большую синюю кнопку и получаем вопрос от системы, с помощью чего открыть ссылку: Chrome, Instagram и прочее. Выбираем Instagram, если не сделали этого ранее и тыркаем «использовать этот выбор всегда». Поздравляю, вы вошли в свой профиль.

Вариант 5.

Сброс до заводских настроек телефона, т.е. полное обнуление. Я не верю в работоспособность, но иногда и палка стреляет. На паре форумов были сообщения о том, что чакры открылись у людей и Instagram их в себя впустил после полного сброса телефона, т.е. обнуления ВСЕЙ информации. Подумайте трижды.

Вариант 6.

Удалить приложение Instagram и установить повторно. Небольшой части пользователей этот способ действительно помогает.

Вариант 7. Последний.

Ждите 14 дней. 14 дней это магическое число и даже сам без всякой магии. Поэтому если вы не можете войти в свой аккаунт сейчас, используйте другой девайс, на котором вы уже залогинены в свой профиль и ждите 2 недели. Отпускает после этого всегда.

Итог.

Проблемы с логином лежат глубже, чем простой глюк системы. Надеюсь великий Маркетолог убережёт нас от худшего сценария, а пока рекомендую заранее связать свои аккаунты в Instagram и Facebook, дабы потом не экспериментировать со входом.

Нам понадобятся следующие страницы:

  • Страница регистрации с формой для регистрации
  • Страница активации аккаунта
  • Страница восстановления пароля
  • Страница сброса пароля

Форма входа на сайт будет размещаться на всех страницах сайта (например, в хедере).

Вот такую страницу регистрации мы хотим получить:

Здесь тип учетной записи будет определять, в какую группу мы зарегистрируем пользователя. Так же полем для идентификации (username) будет электронная почта.

Добавим на страницу вызов сниппета Register :

[[!Register? &submitVar=`register-btn` &activationResourceId=`27` &activationEmailTpl=`Email.Activation` &activationEmailSubject=`Вы зарегистрированы на сайте example.com` &placeholderPrefix=`reg.` &successMsg=`

Спасибо за регистрацию. На вашу электронную почту [[!+reg.email]] отправлено письмо со ссылкой на активацию аккаунта. Пройдите по этой ссылке, чтобы завершить регистрацию.
` &usernameField=`email` &usergroupsField=`reg_type` &customValidators=`valueIn` &validate=`username:blank, reg_type:valueIn=^Readers;Writers;Idlers ^, fullname:required:minLength=^6^, password:required:minLength=^6^, password_confirm:password_confirm=^password^, email:required:email` ]] [[!+error.message:default=`[[!$Register.Form]]`]]

Обратите внимание, что все теги, касающиеся регистрации нужно обязательно вызывать некешированными. Такие же правила действуют при обработке форм сниппетом FormIt.

Разберем параметры вызова:

&submitVar=`register-btn` - указывает атрибут name тега input . То есть сниппет сработает, только если отправлена форма кнопкой с определенным именем.

&activationResourceId=`42` - забегая вперед, 42 – это идентификатор страницы, на которой мы будет активировать пользователя.

&activationEmailTpl=`Email.Activation` - чанк с письмом активации, о нем позже.

&placeholderPrefix=`reg.` - указывает, что все плейсхолдеры, за редким исключением (об этом дальше), которые создаются в данном сниппете, должны начинаться с «reg.».

&successMsg – сообщение, которое выведется при успешной отправке формы. Заметьте, что в нем можно указывать значения из формы и любые другие теги. Данное сообщение запишется в плейсхолдер [[!+error.message]]. Довольно странное название, да и в документации на данный момент ошибка. Там написано [[!+reg.error.message]], но из кода компонента следует, что это не так.

&usernameField=`email` - указывает, что в качестве имени пользователя будет использоваться поле email.

&usergroupsField=`reg_type` - определяет поле, устанавливающее группу, в которую будет добавлен новый пользователь.

&customValidators=`valueIn` - указывает дополнительные валидаторы, которые нужно создать вручную.

&validate – валидаторы задаются через запятую для каждого поля, а если требуется несколько валидаторов для одного поля, то они еще разделяются двоеточием. Разберем их отдельно:

username:blank – нехитрая ловушка для спама, означает, что поле username должно остаться пустое.

reg_type:valueIn=^Readers;Writers;Idlers^ - ограничиваем возможные группы тремя указанными. В изначальной поставке такого нет и злые хацкеры могут зарегиться, например, под группой Administrator (если вы ее не переименовали).

fullname:required:minLength=^6^ - поле fullname должно быть не пусто и содержать хотя бы 6 символов.

password:required:minLength=^6^ - аналогично для пароля.

password_confirm:password_confirm=^password^ - пароли должны совпадать.

email:required:email – электронная почта должна быть не пуста и являться собственно почтой.

Конструкция [[!+error.message:default=`[[!$Register.Form]]`]] выводит сообщение об успешной отправке формы или чанк формы, если вы только зашли на страницу или заполнили ее неправильно.

Создадим вышеупомянутый валидатор valueIn . Для этого создаем сниппет с названием valueIn и следующим кодом:

$valueIn = explode(";", $param); return in_array($value, $valueIn);

Теперь требуется создать чанк Register.Form . В данном случае он будет следующим (используется Bootstrap 3):

[[!+reg.error.fullname:notempty=`
[[!+reg.error.fullname]]
`]]
[[!+reg.error.email:notempty=`
[[!+reg.error.email]]
`]]
[[!+reg.error.password:notempty=`
[[!+reg.error.password]]
`]]
[[!+reg.error.password_confirm:notempty=`
[[!+reg.error.password_confirm]]
`]]

Все поля обязательны для заполнения

В этой форме замечу несколько вещей, касающихся MODX:


– форма обрабатывается на той же странице, на которой показывается.

Установка значения из полученных с формы для того, чтобы в случае провала пользователю не пришлось вводить все заново.

[[!+reg.error.email:notempty=`[[!+reg.error.email]]`]] – опять же в случае провала под полем отобразится сообщение об ошибке.

– обязательно указываем имя кнопки, если ранее устанавливали свойство &submitVar .


Теперь осталось создать чанк Email.Activation с письмом, которое сайт отправляет пользователю:

Спасибо за регистрацию! Чтобы активировать ваш аккаунт, пожалуйста, перейдите по следующей ссылке:

Активировать аккаунт на сайте Example.Com

После активации, вы сможете войти, указав электронную почту и пароль:

Логин: [[+email]]

Пароль: [[+password]]


Здесь можно использовать плейсхолдеры с именами полей формы. Заметьте, что они пишутся уже без «reg.». Так же добавляется плейсхолдер [[+confirmUrl]] , в котором уже сгенерирована ссылка для активации, даже ничего не нужно делать.


Последним штрихом в искусстве регистрации нового аккаунта с помощью компонента Login будет создание страницы активации. Используем для этой страницы пустой шаблон, а в контенте страницы нужно указать всего лишь вызов тега:

[[!ConfirmRegister? &redirectTo=`1`]]

где 1 – идентификатор страницы, на которую пользователь перейдет в случае успешной активации. При этом он уже будет залогиненным.


Приступим к настройке входа в профиль пользователя. Форма авторизации будет простая:

Добавим ее, вызвав в нужном месте:

[[!Login? &loginTpl=`Auth.Login` &logoutTpl=`Auth.Logout` &errTpl=`Auth.Login.Error` &actionKey=`action` &loginKey=`login` &redirectToPrior=`1` &logoutResourceId=`1`]]

Здесь мы указываем чанк с формой для входа, нарисованной выше (&loginTpl=`Auth.Login` ), чанк с кодом, показывающимся авторизованным пользователям (&logoutTpl=`Auth.Logout` ), небольшой чанк с выводом ошибки входа (&errTpl=`Auth.Login.Error` ). Далее следуют параметры:

&actionKey=`action` и &loginKey=`login` - основные идентификаторы для обработки запроса. Первый означает имя параметра в POST-запросе, а второй его значение. То есть форма должна передать значение $_POST["action"]="login", чтобы сниппет Login ее обработал.

&redirectToPrior=`1` - означает, что после входа мы переместимся на ту же страницу, с которой входили.

&logoutResourceId=`1` - при выходе из профиля мы перейдем на страницу с идентификатором 1.


Чанк Auth.Login :

[[!+errors]]

Форма обрабатывается на этой же странице. Если случилась ошибка, то она будет выведена ниже формы в плейсхолдере [[!+errors]]. Так же нужно не забыть ссылки на ресурсы с Регистрацией и восстановлением пароля. Заметьте, что в поле для электронной почты name=«username» – именно в это поле продублировал почту сниппет Register , и оно является для пользователей уникальным.


Чанк Auth.Logout:

[]` &tpl=`User.HeaderBadge` &innerJoin=`{"modUserGroupMember":{"alias":"modUserGroupMember","on":"modUser.id = modUserGroupMember.member"}, "modUserGroup":{"alias":"modUserGroup", "on":"modUserGroupMember.user_group = modUserGroup.id"}}` &select=`{"modUserGroup":{"group_name": "modUserGroup.name"}}` ]]

Выход из профиля

Эта часть не обязательна, если все пользователи в одной группе. Но, чтобы отобразить группу пользователя, стандартных возможностей сниппетов, входящих в компонент Login, недостаточно. Можно написать простенький сниппет для получения названия группы на xPDO , а можно воспользоваться уже готовым сниппетом pdoUsers , входящим в пакет pdoTools . Параметры, указанные в этом сниппете:

&users=`[[+modx.user.id]]` - выбираем только текущего авторизованного пользователя.

&tpl=`User.HeaderBadge` - чанк, в котором мы выведем краткую информацию о пользователе.

&innerJoin – JSON с джойнами таблиц групп пользователей, описание выходит за рамки статьи. Главное это работает J.

&select – JSON, добавляющий в выборку поле modUserGroup.name с алиасом group_name.


Чанк с бейджиком пользователя User.HeaderBadge :

Вы вошли как [[+group_name]] [[+fullname]] Личный кабинет

Если бы нам не нужна была группа пользователя, то содержимое этого чанка можно было бы вставить сразу в чанк Auth.Logout . Здесь можно выводить плейсхолдеры с любыми полями modUser и modUserProfile плюс c помощью pdoUsers добавилось поле group_name .


В чанке Auth.Login.Error простой вывод ошибки:

[[+msg]]

С логином мы закончили. На этом этапе пользователь может зарегистрироваться и успешно войти. Но что, если он забыл пароль? В этом случае он жмякает на ссылку «Забыли пароль?» и переходит на страницу восстановления пароля, которую мы предварительно создаем и помещаем туда вызов:

[[!ForgotPassword? &tpl=`Auth.ForgotPass.Form` &submitVar=`forgotpass` &errTpl=`Auth.Login.Error` &sentTpl=`Auth.ForgotPass.Sent` &emailTpl=`Email.ForgotPass` &emailSubject=`Восстановление доступа к аккаунту на сайте Example.Com` &resetResourceId=`29`]]

Разберем параметры этого вызова:

&tpl=`Auth.ForgotPass.Form` - чанк формы, в которой пользователь введет свой email.

&submitVar=`forgotpass` - в случае сниппета ForgotPassword достаточно, чтобы параметр с таким названием был передан на сервер и не важно с каким непустым значением.

&errTpl=`Auth.Login.Error ` - вывод ошибки аналогично сниппету Login

&sentTpl=`Auth.ForgotPass.Sent` - в этом чанке содержится контент, который будет выведен в случае успешной отправки письма на смену пароля.

&emailTpl=`Email.ForgotPass` - собственно письмо содержится здесь.

&emailSubject =`Восстановление доступа к аккаунту на сайте Example.Com` - заголовок письма.

&resetResourceId=`29` - идентификатор ресурса, на котором будет производиться сброс пароля на новый.


Чанк Auth.ForgotPass.Form:

[[+loginfp.errors]]

Нового здесь только другой способ вывода ошибок в плейсхолдере [[+loginfp.errors]] и передача параметра, что именно эта форма сбрасывает пароль: .

Auth.ForgotPass.Sent:

Информация по восстановлению аккаунта выслана на указанный электронный ящик: [[+email]].

Здесь можно использовать данные из формы выше.


Email.ForgotPass:

[[+fullname]],

Чтобы активировать свой новый пароль, пожалуйста, перейдите по следующей ссылке:

Хочу новый пароль

Если все прошло успешно, вы сможете войти в свой профиль с помощью следующих данных:

Логин: [[+username]]

Пароль: [[+password]]

Спасибо,
Администрация сайта Example.Com

Все очень похоже на чанк письма активации, только пароль здесь сгенерированный в сниппете.


Завершающим штрихом осталось создать ресурс, на который пользователь будет переходить из письма для обновления пароля. В этом ресурсе нам нужен вызов:

[[!ResetPassword:empty=`

Вы не заказывали сброс пароля. Возможно вы ошиблись адресом. Вы можете перейти на Главную страницу сайта или воспользоваться меню выше.

`? &tpl=`Auth.ForgotPass.Reset`]]

Этот код выведет сообщение, если вдруг кто-то забредет на данную страницу повторно или просто случайно. А если пароль успешно сброшен, выведется сообщение из чанка Auth.ForgotPass.Reset:

Ваш пароль успешно сброшен на указанный в письме. Теперь вы можете войти под этим паролем. Не забудьте сменить его в профиле.

Теперь мы имеем полностью рабочую систему авторизации и регистрации пользователей. Изменение профиля авторизованных пользователей оставим за рамками статьи.


1. Создаем страницу регистрации и добавляем на нее вызов сниппета Register .

2. Создаем чанки с формой регистрации Register.Form и письмом активации Email.Activation .

3. Создаем страницу подтверждения регистрации и размещаем на ней вызов сниппета ConfirmRegister .

4. Добавляем вызов сниппета Login туда, где хотим разместить форму входа и бейджик авторизованного пользователя.

5. Создаем чанк с формой входа Auth.Login , чанк с информацией об авторизованном пользователе Auth.Logout , чанк с сообщением об ошибке Auth.Login.Error .

6. Создаем страницу восстановления пароля и размещаем на ней вызов сниппета ForgotPassword .

7. Создаем чанк Auth.ForgotPass.Form с формой для восстановления пароля, чанк Auth.ForgotPass.Sent с сообщением об успешной отправке письма, чанк Email.ForgotPass с письмом на сброс пароля.

8. Создаем ресурс с окончательным сбросом пароля и размещаем в нем вызов сниппета ResetPassword .

9. Создаем чанк Auth.ForgotPass.Reset с сообщением об успешном сбросе пароля.

На этом все. Буду рад любым дополнениям и замечаниям.