34 lines
904 B
PHP
34 lines
904 B
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
use App\Models\User;
|
|
use PragmaRX\Google2FA\Google2FA;
|
|
|
|
class TwoFactorVerification
|
|
{
|
|
/**
|
|
* Valida un código TOTP o de recuperación contra el 2FA de un usuario.
|
|
* Un código de recuperación válido se consume (no sirve una segunda vez).
|
|
*/
|
|
public static function verify(User $user, string $code): bool
|
|
{
|
|
if ($user->two_factor_secret && (new Google2FA())->verifyKey($user->two_factor_secret, $code)) {
|
|
return true;
|
|
}
|
|
|
|
$recoveryCodes = $user->two_factor_recovery_codes ?? [];
|
|
$normalized = strtoupper(trim($code));
|
|
|
|
if (in_array($normalized, $recoveryCodes, true)) {
|
|
$user->forceFill([
|
|
'two_factor_recovery_codes' => array_values(array_diff($recoveryCodes, [$normalized])),
|
|
])->save();
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|