123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- <?php
- namespace App\Http\Controllers\User;
- use App\Http\Controllers\Controller;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Auth;
- use League\CommonMark\Inline\Renderer\ImageRenderer;
- use PragmaRX\Google2FA\Google2FA;
- use BaconQrCode\Renderer\Image\SvgImageBackEnd;
- use BaconQrCode\Renderer\RendererStyle\RendererStyle;
- use BaconQrCode\Writer;
- use App\Models\User;
- class Google2FAController extends Controller
- {
-
- public function index()
- {
- $user = Auth::user();
- $google2fa = new Google2FA();
-
- if (empty($user->google2fa_secret)) {
- $user->google2fa_secret = $google2fa->generateSecretKey();
- $user->save();
- }
-
- $qrCodeUrl = $google2fa->getQRCodeUrl(
- config('app.name', 'Laravel'),
- $user->email,
- $user->google2fa_secret
- );
-
- $renderer = new ImageRenderer(
- new RendererStyle(200),
- new SvgImageBackEnd()
- );
- $writer = new Writer($renderer);
- $qrCode = $writer->writeString($qrCodeUrl);
- return view('user.2fa.index', [
- 'user' => $user,
- 'qrCode' => $qrCode,
- 'secret' => $user->google2fa_secret,
- ]);
- }
-
- public function enable(Request $request)
- {
- $request->validate([
- 'code' => 'required|numeric',
- ]);
- $user = Auth::user();
- $google2fa = new Google2FA();
-
- $valid = $google2fa->verifyKey($user->google2fa_secret, $request->code);
- if ($valid) {
- $user->google2fa_enable = true;
- $user->save();
- return redirect()->route('user.2fa.index')->with('success', '双重验证已成功启用!');
- }
- return redirect()->route('user.2fa.index')->with('error', '验证码无效,请重试!');
- }
-
- public function disable(Request $request)
- {
- $request->validate([
- 'code' => 'required|numeric',
- ]);
- $user = Auth::user();
- $google2fa = new Google2FA();
-
- $valid = $google2fa->verifyKey($user->google2fa_secret, $request->code);
- if ($valid) {
- $user->google2fa_enable = false;
- $user->save();
- return redirect()->route('user.2fa.index')->with('success', '双重验证已成功禁用!');
- }
- return redirect()->route('user.2fa.index')->with('error', '验证码无效,请重试!');
- }
-
- public function verify(Request $request)
- {
- $request->validate([
- 'code' => 'required|numeric',
- ]);
-
- $userId = session('2fa_user_id');
- if (!$userId) {
- return redirect()->route('login');
- }
- $user = User::find($userId);
- if (!$user) {
- return redirect()->route('login');
- }
- $google2fa = new Google2FA();
-
- $valid = $google2fa->verifyKey($user->google2fa_secret, $request->code);
- if ($valid) {
-
- session(['2fa_verified' => true]);
-
- session()->forget('2fa_user_id');
-
- $controller = new \App\Http\Controllers\AuthController();
- $controller->addUserLoginLog($user->id, \App\Components\IP::getClientIp());
-
- $user->update(['last_login' => time()]);
-
- Auth::login($user);
- return redirect()->intended(route('userinfo'));
- }
- return redirect()->route('user.2fa.verify')->with('error', '验证码无效,请重试!');
- }
-
- public function showVerifyForm()
- {
- return view('user.2fa.verify');
- }
- }
|