theriftlab / laravel-mfa
基于电子邮件的简单2FA,使用签名链接。
Requires
- php: ^8.0
- illuminate/broadcasting: ^8.6|^9.0
- illuminate/bus: ^8.6|^9.0
- illuminate/config: ^8.6|^9.0
- illuminate/database: ^8.6|^9.0
- illuminate/events: ^8.6|^9.0
- illuminate/http: ^8.6|^9.0
- illuminate/mail: ^8.6|^9.0
- illuminate/queue: ^8.6|^9.0
- illuminate/routing: ^8.6|^9.0
- illuminate/session: ^8.6|^9.0
- illuminate/support: ^8.6|^9.0
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.php和resources/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