theriftlab/laravel-mfa

该包的最新版本(v0.1.3-beta)没有提供许可证信息。

基于电子邮件的简单2FA,使用签名链接。

v0.1.3-beta 2022-10-27 19:12 UTC

This package is auto-updated.

Last update: 2024-09-27 23:30:20 UTC


README

概述

这是一个基于电子邮件的简单2FA包,可以配置在成功认证后发送包含签名链接的电子邮件。您放置在提供的mfa中间件下的任何路由在点击链接之前都将不可访问。

安装

composer require theriftlab/laravel-mfa

可选,发布迁移

php artisan vendor:publish --tag=mfa-migrations

然后

php artisan migrate

设置

添加到用户模型

首先,您需要将您的User模型(或您用于认证的任何模型)标记为已准备好进行MFA

+use Mfa\Contracts\MfaUser;
+use Mfa\Concerns\Mfa;
...

-class User extends Authenticatable
+class User extends Authenticatable implements MfaUser
{
    use HasApiTokens;
    use HasFactory;
+   use Mfa;
    use Notifiable;
    ...
}

添加到认证流程

由于Laravel的auth/login流程的非标准性质,您需要决定在哪里/何时使用MfaAuth外观来触发和结束MFA会话,该外观需要存在已认证的用户才能工作。

例如,在Breeze设置中,您可能需要在app/Http/Controllers/Auth/AuthenticatedSessionController中添加以下行

use Mfa\Facades\MfaAuth;

...

    public function store(LoginRequest $request)
    {
        $request->authenticate();
        $request->session()->regenerate();

+       if (MfaAuth::isActive()) {
+           MfaAuth::trigger();
+           return redirect()->route('mfa.sent');
+       }

        ...
    }

...

    public function destroy(Request $request)
    {
+       if (MfaAuth::isActive()) {
+           MfaAuth::logout();
+       }

        Auth::guard('web')->logout();
        ...
    }

配置并添加视图

包含签名链接的电子邮件是一个非常简单的模板,可以被发布

php artisan vendor:publish --tag=mfa-views

您还需要实现两个视图文件:resources/views/auth/mfa-sent.blade.phpresources/views/auth/mfa-invalid.blade.php

  • mfa-sent.blade.php在用户首次通过Laravel的默认认证过程授权并等待MFA签名链接电子邮件时显示。此模板可以包含一个链接/按钮,用于将POST数据发送到名为mfa.resend的路由,这将重新发送签名链接电子邮件。如果点击了无效链接,$errors会话数据将包含错误消息,如果重新发送链接电子邮件,则session('status')将包含消息。在此页面上添加注销链接也是一个好主意,以便在登录了错误的帐户时重新开始整个过程。

  • mfa-invalid.blade.php在用户未授权并且点击了无效链接时显示,因此不提供重新发送/注销选项。

注意:当用户未授权并且从电子邮件中点击了一个有效的链接(例如,初始默认认证会话可能已超时)时,用户将被自动登录。

配置您的路由

最后,在您希望用MFA保护的路由中,您可以在auth之后添加mfa中间件 - 例如

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth', 'mfa'])->name('dashboard');

这将重定向任何已Auth但未MFA的用户返回到显示您的auth.mfa-sent视图。

配置

默认配置相当直观,如下所示

// Whether MFA is active
'active' => env('MFA_ACTIVE', true),

// How many minutes the signed link lasts before timing out
'link_timeout' => env('MFA_LINK_TIMEOUT', 60),

// How many chars long the generated code should be
'code_length' => env('MFA_CODE_LENGTH', 32),

// URL to redirect to when link has been authorized
'redirect_url' => env('MFA_REDIRECT_URL', '/'),

// Which model will be adopting the MfaUser functionality
'model' => env('MFA_MODEL', 'App\Models\User'),

如果您想更改默认值,可以发布配置文件

php artisan vendor:publish --tag=mfa-config