mrpunyapal/php-2fa
Composer 安装命令:
composer require mrpunyapal/php-2fa
包简介
Framework-agnostic Two-Factor Authentication actions for PHP with optional Laravel support
README 文档
README
Framework-agnostic Two-Factor Authentication (TOTP) actions for PHP. Works with any authenticator app (Google Authenticator, Authy, etc.). Optional first-party Laravel support included.
Inspired by Laravel Fortify and built on top of pragmarx/google2fa.
Features
- Enable / Disable / Confirm 2FA
- Verify OTP codes
- Recovery code generation, verification, and regeneration
- Enable → Confirm flow (user must verify a code before 2FA is active)
- Framework-agnostic core — use with any PHP application
- Optional Laravel integration with service provider, config, and Eloquent trait
- AES-256-CBC encryption out of the box (
OpenSslEncryptor) - Bring your own encryptor via the
Encryptorcontract
Requirements
- PHP 8.3+
- OpenSSL extension
Installation
composer require mrpunyapal/php-2fa
Laravel
The service provider is auto-discovered. Publish the config:
php artisan vendor:publish --tag="two-factor-config"
Quick Start (Vanilla PHP)
1. Implement TwoFactorUser on your user entity
use MrPunyapal\Php2fa\Contracts\TwoFactorUser; use DateTimeImmutable; class User implements TwoFactorUser { private ?string $twoFactorSecret = null; private ?string $twoFactorRecoveryCodes = null; private ?DateTimeImmutable $twoFactorConfirmedAt = null; public function getTwoFactorSecret(): ?string { return $this->twoFactorSecret; } public function setTwoFactorSecret(?string $secret): void { $this->twoFactorSecret = $secret; } public function getTwoFactorRecoveryCodes(): ?string { return $this->twoFactorRecoveryCodes; } public function setTwoFactorRecoveryCodes(?string $codes): void { $this->twoFactorRecoveryCodes = $codes; } public function getTwoFactorConfirmedAt(): ?DateTimeImmutable { return $this->twoFactorConfirmedAt; } public function setTwoFactorConfirmedAt(?DateTimeImmutable $confirmedAt): void { $this->twoFactorConfirmedAt = $confirmedAt; } }
See docs/examples/php/setup-two-factor.php for a full PDO-backed implementation.
2. Use TwoFactorManager
use MrPunyapal\Php2fa\TwoFactorManager; $manager = TwoFactorManager::create( issuer: 'My App', encryptionKey: 'your-secret-encryption-key', ); // Enable 2FA $setup = $manager->enable($user, 'user@example.com'); // $setup->secret — plain text secret (show once) // $setup->qrCodeUrl — otpauth:// URL (render as QR code) // $setup->recoveryCodes — array of recovery codes (show once) // Confirm 2FA (user enters code from authenticator app) $manager->confirm($user, $otpCode); // Verify OTP or recovery code during login $valid = $manager->verify($user, $code); // Regenerate recovery codes $newCodes = $manager->regenerateRecoveryCodes($user); // Disable 2FA $manager->disable($user);
Using Individual Actions
If you prefer dependency injection or want granular control:
use MrPunyapal\Php2fa\Actions\EnableTwoFactorAuthentication; use MrPunyapal\Php2fa\Actions\ConfirmTwoFactorAuthentication; use MrPunyapal\Php2fa\Actions\VerifyTwoFactorCode; use MrPunyapal\Php2fa\Actions\DisableTwoFactorAuthentication; use MrPunyapal\Php2fa\Actions\GenerateRecoveryCodes; use MrPunyapal\Php2fa\Services\TwoFactorService; use MrPunyapal\Php2fa\Support\OpenSslEncryptor; $service = new TwoFactorService(issuer: 'My App'); $encryptor = new OpenSslEncryptor('your-secret-key'); $enable = new EnableTwoFactorAuthentication($service, $encryptor); $setup = $enable($user, 'user@example.com'); $confirm = new ConfirmTwoFactorAuthentication($service, $encryptor); $confirm($user, $otpCode); $verify = new VerifyTwoFactorCode($service, $encryptor); $isValid = $verify($user, $code); $regenerate = new GenerateRecoveryCodes($encryptor); $codes = $regenerate($user); $disable = new DisableTwoFactorAuthentication(); $disable($user);
Laravel Usage
Add the trait to your User model
use MrPunyapal\Php2fa\Contracts\TwoFactorUser; use MrPunyapal\Php2fa\Laravel\Concerns\HasTwoFactorAuthentication; class User extends Authenticatable implements TwoFactorUser { use HasTwoFactorAuthentication; }
Add the required columns
Schema::table('users', function (Blueprint $table) { $table->text('two_factor_secret')->nullable(); $table->text('two_factor_recovery_codes')->nullable(); $table->timestamp('two_factor_confirmed_at')->nullable(); });
Inject actions or manager
use MrPunyapal\Php2fa\Actions\EnableTwoFactorAuthentication; class TwoFactorController extends Controller { public function store( Request $request, EnableTwoFactorAuthentication $enable, ) { $setup = $enable($request->user(), $request->user()->email); return response()->json([ 'qr_code_url' => $setup->qrCodeUrl, 'recovery_codes' => $setup->recoveryCodes, ]); } }
Batch saves with withoutSaving()
By default, each setter on the HasTwoFactorAuthentication trait persists immediately. To batch multiple field changes into a single DB write:
$user->withoutSaving(function ($user) { $user->setTwoFactorSecret($encrypted); $user->setTwoFactorRecoveryCodes($codes); $user->setTwoFactorConfirmedAt(null); }); // One save() call instead of three
Examples
Full working examples are available in the docs/examples/ directory.
Laravel Examples
| File | Description |
|---|---|
| TwoFactorController.php | Controller with enable, confirm, verify, disable, and regenerate actions |
| EnsureTwoFactorVerified.php | Middleware that requires 2FA verification before accessing protected routes |
| routes.php | Route definitions with proper middleware stacking |
| two-factor-verify.blade.php | Blade view for OTP / recovery code input |
| migration.php | Migration to add 2FA columns to users table |
PHP Examples
| File | Description |
|---|---|
| setup-two-factor.php | Full setup flow with PDO-backed TwoFactorUser implementation |
| login-with-two-factor.php | Session-based login flow with 2FA challenge |
| manage-recovery-codes.php | Regenerate, display, and verify recovery codes |
| qr-code-display.php | Render QR codes using Google Charts, chillerlan/php-qrcode, or endroid/qr-code |
| custom-encryptor.php | Custom Encryptor implementation using Sodium (libsodium) |
Configuration
// config/two-factor.php return [ 'issuer' => env('TWO_FACTOR_ISSUER', config('app.name', 'My App')), 'secret_length' => (int) env('TWO_FACTOR_SECRET_LENGTH', 32), 'window' => (int) env('TWO_FACTOR_WINDOW', 1), 'algorithm' => env('TWO_FACTOR_ALGORITHM', 'sha1'), // sha1, sha256, sha512 'recovery_code_count' => (int) env('TWO_FACTOR_RECOVERY_CODE_COUNT', 8), ];
Custom Encryptor
Implement the Encryptor contract to use your own encryption strategy:
use MrPunyapal\Php2fa\Contracts\Encryptor; class MyEncryptor implements Encryptor { public function encrypt(string $value): string { // your encryption logic } public function decrypt(string $value): string { // your decryption logic } }
Then pass it to the actions or bind it in Laravel's container. See docs/examples/php/custom-encryptor.php for a complete Sodium-based implementation.
API Reference
Actions
| Action | Purpose |
|---|---|
EnableTwoFactorAuthentication |
Generates secret + recovery codes, stores encrypted on user |
DisableTwoFactorAuthentication |
Clears all 2FA fields on user |
ConfirmTwoFactorAuthentication |
Verifies OTP code and sets confirmed timestamp |
VerifyTwoFactorCode |
Verifies OTP or recovery code, replaces used recovery codes |
GenerateRecoveryCodes |
Generates new set of recovery codes |
Exceptions
| Exception | When |
|---|---|
InvalidOtpException |
OTP code verification fails during confirmation |
TwoFactorNotEnabledException |
Action requires 2FA to be enabled but it isn't |
EncryptionException |
Encryption or decryption operation fails |
Testing
composer test
Credits
License
The MIT License (MIT). Please see License File for more information.
mrpunyapal/php-2fa 适用场景与选型建议
mrpunyapal/php-2fa 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5 次下载、GitHub Stars 达 19, 最近一次更新时间为 2026 年 02 月 21 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「Authentication」 「two-factor」 「laravel」 「otp」 「totp」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 mrpunyapal/php-2fa 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 mrpunyapal/php-2fa 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 mrpunyapal/php-2fa 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Filament Two Factor Authentication: Google 2FA + Passkey Authentication
Automatically logs-in users if they are already authenticated by a remote source. (e.g. environment variable REMOTE_USER)
GraphQL authentication for your headless Craft CMS applications.
Novactive eZ 2FA Bundle is an Ibexa bundle that provides two-factor authentication for your Ibexa project
Two-factor Authentication for WordPress
Laravel middleware to restrict a site or specific routes using HTTP basic authentication
统计信息
- 总下载量: 5
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 19
- 点击次数: 38
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-21