Дополнительный шаг перед входом пользователя в систему

Я реализовал возможность регистрации / входа по умолчанию с Laravel 5.4.

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

Мой вопрос: как можно создать этот дополнительный шаг в потоке входа в систему с помощью Laravel 5.4? В настоящее время LoginController, созданный Laravel, пуст, и я не знаю, как закрепиться в процессе входа в систему.

1

Решение

Как указано в комментариях, есть несколько шагов к этой проблеме.

  1. Создайте безопасный токен.
  2. Отправить электронное письмо пользователю.
  3. Позвольте пользователю опубликовать этот токен.
  4. Проверьте, если пользователь подтвержден в случае необходимости.

Я думаю, что часть генерации токенов должна быть тривиальной. Итак, чтобы продолжить:

Отправить электронное письмо пользователю, это снова можно разбить на несколько этапов.

  1. Определить, когда пользователь зарегистрирован.
  2. Трансляция события.
  3. Послушайте это событие.
  4. Обработайте событие.

    /**
    * Create a new user instance after a valid registration.
    *
    * @param  array  $data
    * @return User
    */
    protected function create(array $data){
    $user = User::create([
    'name' => $data['firstname'] . " " . $data['lastname'],
    'email' => $data['email'],
    'password' => bcrypt($data['password']),
    'email_token' => str_random(10),
    'verified' => false
    ]);
    
    event(new UserRegistered($user));
    
    return $user;
    }
    

Для этого вам нужно будет добавить email_token а также verified поля к вашему User модель с миграциями.

Это создаст нового пользователя и сгенерирует токен (это поколение токенов не является безопасным! После этого оно сработает UserRegistered событие.

Это событие будет выглядеть примерно так:

class UserRegistered{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $user;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(User $user){
$this->user = $user;
}
}

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

class UserListener{
/**
* Handle the event.
*
* @param  UserRegistered  $event
* @return void
*/
public function handle(UserRegistered $
Mail::to($event->user)->send(new EmailVerification($event->user));
//EmailVerficiation is an instance of Mailable;
}
}

И привязать этого слушателя к вашему событию, в вашем AppServiceProvider отредактируйте следующее:

protected $listen = [
'App\Events\UserRegistered' => [
'App\Listeners\UserListener',
],

];

После всего этого вам нужно будет создать маршрут, с помощью которого пользователи смогут подтвердить свою электронную почту.

Затем вы можете создать новое промежуточное программное обеспечение:

class EmailVerification
{
/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->verified) {

return $next($request);
}

return redirect('/wait_for_approval');
// Or any other route to indicate that they need to validate their email.
}
}

Это промежуточное программное обеспечение затем должно быть зарегистрировано в вашем Kernel.php, в вашем $routeMiddleware добавлять 'auth.approved_email' => \App\Http\Middleware\EmailVerification::class,

Затем вы можете использовать это промежуточное ПО напрямую или поместить его в группу с другим промежуточным ПО.

2

Другие решения

Чтобы достичь того, что вы хотите, вы хотите использовать промежуточное программное обеспечение Laravel. Для получения дополнительной информации смотрите здесь — https://laravel.com/docs/5.4/middleware#registering-middleware

-2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector