BackupCodeController.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Facades\Webauthn;
  4. use App\Http\Controllers\Controller;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Hash;
  7. use PragmaRX\Google2FALaravel\Support\Authenticator;
  8. class BackupCodeController extends Controller
  9. {
  10. public function __construct()
  11. {
  12. $this->middleware('auth');
  13. $this->middleware('throttle:3,1')->only('login');
  14. }
  15. public function index(Request $request)
  16. {
  17. $authenticator = app(Authenticator::class)->boot($request);
  18. if (($authenticator->isAuthenticated() || ! $request->user()->two_factor_enabled) && ! Webauthn::enabled($request->user())) {
  19. return redirect('/');
  20. }
  21. return view('auth.backup_code');
  22. }
  23. public function login(Request $request)
  24. {
  25. $this->validate($request, [
  26. 'backup_code' => 'required',
  27. ]);
  28. if (! Hash::check($request->backup_code, user()->two_factor_backup_code)) {
  29. return back()->withErrors([
  30. 'backup_code' => __('The backup code was invalid.')
  31. ]);
  32. }
  33. $twoFactor = app('pragmarx.google2fa');
  34. user()->update([
  35. 'two_factor_enabled' => false,
  36. 'two_factor_secret' => $twoFactor->generateSecretKey(),
  37. 'two_factor_backup_code' => null
  38. ]);
  39. user()->webauthnKeys()->delete();
  40. if ($request->session()->has('intended_path')) {
  41. return redirect($request->session()->pull('intended_path'));
  42. }
  43. return redirect()->intended($request->redirectPath);
  44. }
  45. }