1. Go to this page and download the library: Download mrpunyapal/php-2fa library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
mrpunyapal / php-2fa example snippets
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; }
}
use MrPunyapal\Php2fa\TwoFactorManager;
$manager = TwoFactorManager::create(
issuer: 'My App',
encryptionKey: 'your-secret-encryption-key',
);
// Enable 2FA
$setup = $manager->enable($user, '[email protected]');
// $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);
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, '[email protected]');
$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);
use MrPunyapal\Php2fa\Contracts\TwoFactorUser;
use MrPunyapal\Php2fa\Laravel\Concerns\HasTwoFactorAuthentication;
class User extends Authenticatable implements TwoFactorUser
{
use HasTwoFactorAuthentication;
}
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();
});
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,
]);
}
}
$user->withoutSaving(function ($user) {
$user->setTwoFactorSecret($encrypted);
$user->setTwoFactorRecoveryCodes($codes);
$user->setTwoFactorConfirmedAt(null);
});
// One save() call instead of three
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
}
}