Я реализовал возможность регистрации / входа по умолчанию с Laravel 5.4.
Теперь я хочу добавить второй фактор к аутентификации. После того, как пользователь вводит свои учетные данные, я хочу отправить ему электронное письмо с кодом безопасности и предоставить пользователю форму, в которую он вставляет код безопасности из своего электронного письма. Только после того, как он введет правильный код безопасности, я хочу разрешить пользователю войти в систему.
Мой вопрос: как можно создать этот дополнительный шаг в потоке входа в систему с помощью Laravel 5.4? В настоящее время LoginController, созданный Laravel, пуст, и я не знаю, как закрепиться в процессе входа в систему.
Как указано в комментариях, есть несколько шагов к этой проблеме.
Я думаю, что часть генерации токенов должна быть тривиальной. Итак, чтобы продолжить:
Отправить электронное письмо пользователю, это снова можно разбить на несколько этапов.
Обработайте событие.
/**
* 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,
Затем вы можете использовать это промежуточное ПО напрямую или поместить его в группу с другим промежуточным ПО.
Чтобы достичь того, что вы хотите, вы хотите использовать промежуточное программное обеспечение Laravel. Для получения дополнительной информации смотрите здесь — https://laravel.com/docs/5.4/middleware#registering-middleware