@Andre548

Как настроить правильно аутентификацию по почте или номеру телефона?

Всем привет! При регистрации у меня телефон с маской записывается- тоесть в таком виде +7 (555) 555-5555
Пока аутентификация работает только на рф, но будут в дальнейшем и другие страны со своей маской.

Собственно вопрос- при аутентификации, пользователь в поле может указать либо почту либо телефон, маску не могу повесить, так как не даст тогда почту ввести. Какой может быть выход? Может подкинете идею как лучше сделать, может без маски записывать в бд, но как тогда валидировать номер? пользователь может ввести как +7, 7 или 8
  • Вопрос задан
  • 264 просмотра
Пригласить эксперта
Ответы на вопрос 3
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Можно использовать метод prepareForValidation()
https://laravel.com/docs/10.x/validation#preparing...
для того чтобы подготовить данные. В случае с номером телефона удалить из строки всё кроме цифр. Email перед нами или номер телефона можно определять по наличию "@" в запросе.
Частные случае типа 8-xxx- считать как 7-ххх- тоже можете там разместить и заменять первую 8 на 7
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега PHP
frontend developer
тут масса вариантов.

на фронте можно два поля выводить с логикой ИЛИ
одно из можно прятать, примерно так:

Ваш Email: ____________
Link: Войти по номеру телефона

Ваш телефон: ____________
Link: Войти по Email


При клике на ссылку поле для мыла прятать и показывать поле для телефона (каждое со своей маской). Текст ссылки соответственно тоже менять на "Войти по имейл"

На бэке как уже отметили использовать prepareForValidation. Номер телефона нормализовывать. Проще всего вырезать всё, кроме цифр и так хранить в базе. При выводе форматировать как нравится.
А чтобы юзер не забыл, что он вводил при регистрации, восьмерку или семерку, использовать вот эту продвинутую маску https://intl-tel-input.com/ Эта библиотечка, кстати, и нормализацию делает.
Ответ написан
Комментировать
@psiklop
Типа так как минимум:
$phone = (preg_match("/^\d{11}$/", $_=preg_replace("/\D/", "", $_POST["phone"])))?$_:null;


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

P.S. Давно находил на stackoverflow маску (чтобы не юзать библиотеки) и сам еще доработал, использовал у себя вроде норм.

$("[name=phone]").on('paste', (e) => {
	   let x = (e.target.value.substr(2) + e.originalEvent.clipboardData.getData('text/plain')).replace(/\D/g, '').match(/\d{1,10}$/);
	   if (x[0].length)	$(e.target).val("7" + x[0]).trigger("input");
	   e.preventDefault();
	}).on('input', (e) => {
	   let x = e.target.value.replace(/\D/g, '').match(/(\d{0,4})(\d{0,3})(\d{0,4})/);
	   e.target.value = !x[2] ? (x[1].length > 1 ? '+' + x[1][0] + ' (' + x[1].substr(1): '+7 (') : '+' + x[1][0] + ' (' + x[1].substr(1) + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
	}).trigger("input");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы