roke22/google2fa-laravel

一个一次性密码认证包,兼容Google Authenticator。

2.2 2023-09-30 11:52 UTC

This package is auto-updated.

Last update: 2024-09-30 02:00:03 UTC


README

Latest Stable Version License Code Quality Build

Downloads Coverage StyleCI PHP

Laravel的Google双因素认证包

Google2FA是Google双因素认证模块的PHP实现,支持在RFC 4226中指定的基于HMAC的一次性密码(HOTP)算法和在RFC 6238中指定的基于时间的一次性密码(TOTP)算法。

此包是Google2FA的PHP包的Laravel桥梁。

此包的目的是创建Google2FA的二维码并检查用户输入的代码。如果您需要创建备份/恢复代码,请参阅以下内容。

恢复/备份代码

如果您需要创建恢复或备份代码以提供一种方式让您的用户恢复丢失的帐户,您可以使用恢复包

演示、示例和沙盒

请查看Google2FA包沙盒

playground

这是一个演示应用程序,展示了如何使用Google2FA:google2fa-example

您可以使用Google Authenticator应用程序扫描此(旧)演示页面上的二维码,并实时查看代码更改(几乎)。

兼容性

在Google2FA 2.0(Laravel 5.1)之前,您必须安装pragmarx/google2fa:~1.0,因为此包既是Laravel包也是PHP(无偏见)。

演示

点击这里查看中间件演示

middleware

安装

使用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包,请查看它以获取有关如何配置适当的QRCode生成器的更多信息。

Imagick QRCode后端

有三个可用的:imagemagick(默认)、svgeps

您可以通过配置来更改它

/*
 * 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();

如果您不想使用外观,您也可以

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,
];

事件

以下事件将被触发

  • EmptyOneTimePasswordReceived
  • LoggedOut
  • LoginFailed
  • LoginSucceeded
  • OneTimePasswordExpired
  • OneTimePasswordRequested

文档

请查看主Google2FA仓库中的ReadMe文件。

测试

该软件包的测试是用phpspec编写的。

作者

Antonio Carlos Ribeiro

许可

Google2FA根据MIT许可证授权 - 有关详细信息,请参阅LICENSE文件

贡献

欢迎提出拉取请求和问题。