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