pragmarx / google2fa-laravel
一个一次性密码认证包,兼容Google Authenticator。
Requires
- php: >=7.0
- laravel/framework: ^5.4.36|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- pragmarx/google2fa-qrcode: ^1.0|^2.0|^3.0
Requires (Dev)
- bacon/bacon-qr-code: ^2.0
- orchestra/testbench: 3.4.*|3.5.*|3.6.*|3.7.*|4.*|5.*|6.*|7.*|8.*|9.*
- phpunit/phpunit: ~5|~6|~7|~8|~9|~10
Suggests
- bacon/bacon-qr-code: Required to generate inline QR Codes.
- pragmarx/recovery: Generate recovery codes.
README
Laravel的Google双因素认证包
Google2FA是Google双因素认证模块的PHP实现,支持在RFC 4226中指定的基于HMAC的一次性密码(HOTP)算法和RFC 6238中指定的基于时间的一次性密码(TOTP)算法。
此包是Google2FA PHP包的Laravel桥梁。
此包的目的是生成Google2FA的二维码并检查用户输入的代码。如果您需要创建备份/恢复代码,请查看以下内容。
恢复/备份代码
如果您需要创建恢复或备份代码以提供用户恢复丢失账户的方式,您可以使用恢复包。
演示、示例和游乐场
请查看Google2FA包游乐场。
这是一个演示应用程序,展示了如何使用Google2FA:google2fa-example。
您可以使用Google Authenticator应用程序扫描此(旧)演示页面上的二维码,并实时查看代码变化(几乎)。
兼容性
在Google2FA 2.0(Laravel 5.1)之前,您必须安装pragmarx/google2fa:~1.0
,因为此包既是Laravel包也是PHP(不可知)。
演示
点击此处查看中间件演示
安装
使用Composer安装
composer require pragmarx/google2fa-laravel
在Laravel上安装
Laravel 5.5及以上
您不需要做任何事情,此包自动加载服务提供程序并创建别名,使用新的自动发现功能。
Laravel 5.4及以下
将服务提供程序和外观别名添加到您的app/config/app.php
(Laravel 4.x)或config/app.php
(Laravel 5.x)
PragmaRX\Google2FALaravel\ServiceProvider::class, 'Google2FA' => PragmaRX\Google2FALaravel\Facade::class,
发布配置文件
php artisan vendor:publish --provider="PragmaRX\Google2FALaravel\ServiceProvider"
使用它
使用外观
use Google2FA; return Google2FA::generateSecretKey();
在Laravel中,您可以使用IoC容器
$google2fa = app('pragmarx.google2fa'); return $google2fa->generateSecretKey();
中间件
此包有一个中间件,可以帮助您在应用程序中实现双因素认证。要使用它,您只需
将中间件添加到您的Kernel.php
protected $routeMiddleware = [ ... '2fa' => \PragmaRX\Google2FALaravel\Middleware::class, ];
在路由中使用它
Route::get('/admin', function () { return view('admin.index'); })->middleware(['auth', '2fa']);
二维码
此包使用Google2FA-QRCode包,请查看它以获取有关如何配置适当二维码生成器的更多信息。
Imagick QRCode后端
有三个可用选项:imagemagick(默认)、svg和eps。
您可以通过配置更改它
/* * Which image backend to use for generating QR codes? * * Supports imagemagick, svg and eps */ 'qrcode_image_backend' => \PragmaRX\Google2FALaravel\Support\Constants::QRCODE_IMAGE_BACKEND_IMAGEMAGICK,
或运行时
Google2FA::setQRCodeBackend('svg');
配置视图
您可以在配置文件(config/google2fa.php)中设置您的“请求一次性密码”视图
/** * One Time Password View */ 'view' => 'google2fa.index',
并在视图中只需提供一个包含输入的表单,该输入也是可配置的
/** * One Time Password request input name */ 'otp_input' => 'one_time_password',
以下是一个表单示例
<form action="/google2fa/authenticate" method="POST"> <input name="one_time_password" type="text"> <button type="submit">Authenticate</button> </form>
一次性密码有效期
通常OTP永远有效,直到用户注销您的应用程序,但为了提高应用程序的安全性,您可能希望定期重新请求,仅针对Google OTP。因此,您可以在此设置分钟数
/** * Lifetime in minutes. * In case you need your users to be asked for a new one time passwords from time to time. */ 'lifetime' => 0, // 0 = eternal
请注意,这使用的是 Laravel 的会话功能。如果这个数字超过了在 config('session.lifetime')
中设置的值,即使您的 OTP 有效期尚未结束,您仍然会被登出。
您可以选择在用户浏览网站时是否保持 OTP 活跃。
/** * Renew lifetime at every new request. */ 'keep_alive' => true,
从 2Fa 手动登出
此命令将登出用户并在下一次请求中将其重定向到 2FA 表单。
Google2FA::logout();
如果您不想使用 Facade,您可以
use PragmaRX\Google2FALaravel\Support\Authenticator; (new Authenticator(request()))->logout();
在 X 次尝试后进行限制/锁定
除非您需要一些非常复杂的功能,否则您可能可以使用 Laravel 的 路由限制中间件 来实现这一点
Route::get('/admin', function () { return view('admin.index'); })->middleware(['auth', '2fa', 'throttle']);
无状态使用
$authenticator = app(Authenticator::class)->bootStateless($request); if ($authenticator->isAuthenticated()) { // otp auth success! }
您也可以使用无状态中间件
protected $routeMiddleware = [ ... '2fa' => \PragmaRX\Google2FALaravel\MiddlewareStateless::class, ];
通过记住功能进行 2FA 和 Laravel 登录
当 Laravel 通过记住功能激活登录时,会话将被更新,并需要再次输入 2FA 代码。为了解决这个问题,请将 LoginViaRemember
监听器添加到您的 App\Providers\EventServiceProvider
use Illuminate\Auth\Events\Login; use PragmaRX\Google2FALaravel\Listeners\LoginViaRemember; class EventServiceProvider extends ServiceProvider { protected $listen = [ Login::class => [ LoginViaRemember::class, ], ]; ...
事件
以下事件会被触发
- EmptyOneTimePasswordReceived
- LoggedOut
- LoginFailed
- LoginSucceeded
- OneTimePasswordExpired
- OneTimePasswordRequested
文档
请检查 Google2FA 主 GitHub 仓库中的 ReadMe 文件。
测试
该软件包的测试是用 phpspec 编写的。
作者
许可协议
Google2FA 采用 MIT 许可协议 - 有关详细信息,请参阅 LICENSE 文件
贡献
我们非常欢迎拉取请求和问题。