Двухфакторная аутентификация (2FA) значительно увеличивает безопасность веб-приложений, добавляя дополнительный уровень защиты к стандартной аутентификации по имени пользователя и паролю. В Laravel можно реализовать двухфакторную аутентификацию через почту, отправляя пользователям временные коды или ссылки для подтверждения их идентификации. В этой статье мы рассмотрим, как настроить двухфакторную аутентификацию через почту в Laravel.

Шаг 1: Установка и настройка Laravel

Шаг 1: Убедитесь, что у вас установлен Laravel и настроены базовые настройки.

Шаг 2: В файле .env убедитесь, что настройки почтового сервера указаны правильно, как описано в предыдущем разделе.

Шаг 2: Создание маршрутов и контроллеров

Шаг 1: Создайте маршруты для активации и проверки двухфакторной аутентификации:

// routes/web.php

Route::get('/2fa/activate', 'TwoFactorAuthController@activate')->name('2fa.activate');
Route::post('/2fa/verify', 'TwoFactorAuthController@verify')->name('2fa.verify');

Шаг 2: Создайте контроллер TwoFactorAuthController с методами activate и verify:

php artisan make:controller TwoFactorAuthController

Шаг 3: Реализация двухфакторной аутентификации

Шаг 1: В методе activate контроллера генерируйте код для двухфакторной аутентификации и отправляйте его пользователю по электронной почте:

public function activate(Request $request)
{
    $user = Auth::user();
    $code = rand(100000, 999999);
    $user->two_factor_code = $code;
    $user->two_factor_expires_at = now()->addMinutes(10);
    $user->save();

    Mail::to($user->email)->send(new TwoFactorCodeMail($code));

    return redirect()->route('2fa.verify');
}

Шаг 2: В методе verify проверяйте код, введенный пользователем, и аутентифицируйте пользователя:

public function verify(Request $request)
{
    $request->validate([
        'code' => 'required',
    ]);

    $user = Auth::user();

    if ($request->code == $user->two_factor_code && $user->two_factor_expires_at->gt(now())) {
        $user->two_factor_code = null;
        $user->two_factor_expires_at = null;
        $user->save();

        return redirect()->route('home');
    }

    return back()->withErrors(['code' => 'Invalid two-factor code.']);
}

Шаг 4: Создание уведомления для отправки кода

Шаг 1: Создайте уведомление TwoFactorCodeMail с помощью команды php artisan make:notification:

php artisan make:notification TwoFactorCodeMail

Шаг 2: В классе уведомления определите метод toMail, который будет использоваться для отправки уведомления по электронной почте:

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class TwoFactorCodeMail extends Notification
{
    protected $code;

    public function __construct($code)
    {
        $this->code = $code;
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('Your two-factor authentication code is: ' . $this->code)
                    ->action('Verify Code', url('/2fa/verify'));
    }
}

Заключение

Реализация двухфакторной аутентификации через почту в Laravel улучшает безопасность веб-приложений, добавляя дополнительный уровень защиты к стандартной аутентификации. Этот подход позволяет автоматически уведомлять пользователей о необходимости подтверждения их идентификации, улучшая пользовательский опыт и обеспечивая более высокий уровень безопасности.