pragmarx/recovery
Generate customizable recovery/backup codes for 2FA account recovery. Create arrays, JSON, or (Laravel) Collections, and tune how many codes to make plus blocks and characters per block for your preferred format and length.
pragmarx/recovery package is a lightweight solution for generating TOTP (Time-Based One-Time Password) recovery codes (e.g., backup codes for 2FA). It fits well in systems requiring fallback authentication (e.g., password managers, banking apps, or SaaS platforms with MFA).Illuminate\Auth, Laravel\Fortify, or Laravel\Jetstream). Can complement existing MFA solutions like pragmarx/totp-laravel or bacon/bacon-qr-code.RecoveryCodeGenerator class with a single method (generate()), reducing custom implementation effort.recovery_codes table (or column) in the users table. Laravel’s migrations can handle this with minimal effort.Hash facade or encrypt()) to prevent exposure in DB dumps.throttle middleware).N uses).paragonie/random_compat is outdated).AuthenticatesUsers trait or custom guards.recovery_codes JSON column to the users table.recovery-codes-generated events for logging/notifications.composer require pragmarx/recovery
Schema::table('users', function (Blueprint $table) {
$table->json('recovery_codes')->nullable();
});
RegisterUser or UpdateProfile command:
$generator = new \Pragmarx\Recovery\RecoveryCodeGenerator();
$user->recovery_codes = $generator->generate(10); // 10 codes
$user->save();
$user->recovery_codes = array_map(
fn($code) => \Illuminate\Support\Facades\Crypt::encrypt($code),
$generator->generate(10)
);
Route::post('/recover', function (Request $request) {
$valid = $this->validateRecoveryCode($request->code);
if (!$valid) abort(403);
// Proceed with recovery...
});
random_bytes() + bcrypt for code generation.spatie/laravel-2fa (includes recovery codes).pragmarx/totp-laravel)./recover route).spatie/laravel-2fa).random_bytes() isn’t blocked by PHP policies.| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Database corruption | Lost recovery codes | Regular backups + encrypted storage |
| Code exposure (e.g., SQLi) | Account compromise | Input sanitization + rate-limiting |
| Package vulnerabilities | Predictable codes | Custom implementation or fork |
| User loses all recovery codes | Account lockout | Admin recovery flow (with MFA) |
How can I help you explore Laravel packages today?