Как правильно реализовать регистрацию с подтверждением номера на laravel

139
05 мая 2022, 06:10

Вопрос в загаловке, есть форма:

<form method="post" action="/register" id="form_register">
            {{ csrf_field() }}
            <label for="login">
                <p>Логин:</p>
                <input type="text" name="login" placeholder="" required>
            </label>
            <label for="password">
                <p>Пароль:</p>
                <input type="password" name="password" placeholder="" required>
            </label>
            <label for="password-confirmation">
                <p>Подтвердите пароль:</p>
                <input type="password" name="password_confirmation" placeholder="" required>
            </label>
            <label for="phone">
                <p>Номер телефона:</p>
                <input id="send_sms" type="phone" name="phone" placeholder="8 999 999 99 99" maxlength ="11" required>
            </label>
            <input type="submit" name="regiser-sub" class="button" value="Зарегистрироваться">
            @include('sessions.errors')
        </form>

Контроллер

<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
class RegistrationController extends Controller
{
    public function create(){
        return view("sessions.create-user");
    }
    public function store(Request $request){
        $this->validate($request, [
            'login' => 'required',
            'password' => 'required|alpha_num|between:4,12|confirmed',
            'password_confirmation' => 'required|alpha_num|between:4,12',
            'phone' => 'required|digits:11',
        ]);
        $user = User::create(request(['login', 'password', 'phone']));
        auth()->login($user);
        return redirect()->home();
    }
    public function destroy(Request $request){
        auth()->logout();
        return redirect()->home();
    }
}

Есть смс-шлюз который отправляет смс таким запросом https://g.s.ru/v2/sms/send?number=7999999999&text=F:+6844&sign=SMS Собственно вопрос - нужно при заполнении поля "номер телефона" сделать аякс запрос на отдельный метод контроллера который будет получать номер введенный и формировать рандомный код, затем курлом отправлять этот код по смс и если код совпадает регистрировать пользователя? Ни разу такое не реализовавал, поэтому не знаю принцип, буду благодарен за подсказку как правильно сделать.

Answer 1

Общая идея:

  • создать случайный код

  • сохранить в сессию

  • выслать через смс

  • при сохранении формы, обязательно, проверить введеный код с кодом который в сессии

  • Создаешь обработчик в api.php. и контроллер, который будет отправлять через шлюз событие.

POST /api/register/send-sms
{
'phone': 799999999
}
  • В форме для поля phone на подписываешься на событие blur получаешь содержимое поля ajax запросом на на адрес /api/register/send-sms.

  • В контроллере генерируешь случайное число 23123.

  • Сохраняешь в session()->put('phone', '23123') - понадобится для валидации.

  • Отправляешь через sms шлюз.

Но, в указанной выше форме нет поля ввода кода подтверждения и я бы добавил его в форму.

$this->validate($request, [
            'login' => 'required',
            'password' => 'required|alpha_num|between:4,12|confirmed',
            'password_confirmation' => 'required|alpha_num|between:4,12',
            'phone' => 'required|digits:11',
            'code_confirmation' => 'required|digits:5',
        ]);

Пользователь отправляет форму с кодом подтверждения. Валидация проверит что поля заполнены, но не проверит верность code_confirmation и здесь 2 пути:

В контроллере:

$code = session()->get($request->get('phone'));
if($code !== $request->get('code_confirmation')){
  // отправляешь код ошибки
}

Или в ReqestForm, но сути это не изменит. Подробнее можно найти в документации.

Я бы перенес все в ReqestForm для чистоты кода.

READ ALSO
Передать значение переменной из одного метода класса другой, каков оптимальный способ?

Передать значение переменной из одного метода класса другой, каков оптимальный способ?

Есть один класс и две функции внутри негоВо второй функции нужно значение переменной, которая получается из функции №1

255
Кодировка строки в Base64

Кодировка строки в Base64

Есть строка , необходимо её закодировать в Base64, как на этом сайте

204
Определение наследуемого класса Unity

Определение наследуемого класса Unity

У меня есть некий кошелек, в котором пока что есть только монетки и ключи для сундуковНа данный момент player выглядит вот так:

199
ASP.Net Core Web API единый формат ответов

ASP.Net Core Web API единый формат ответов

Собственно вопрос в тайтлеЧто я хочу: единый формат ответов от API как у VK

286