validate([ 'email' => 'required|email', ]); $result = $this->authService->sendMagicLink( $request->email, $request->ip(), $request->userAgent() ); $loginUrl = URL::temporarySignedRoute( 'magic-link.verify', now()->addMinutes(15), ['token' => $result->plainToken] ); Mail::to($request->email)->queue(new MagicLoginLink($loginUrl, $result->plainCode, 15)); return redirect()->route('verify-code') ->with('status', 'Check your email for your login code!') ->with('email', $request->email); } /** * Show the code verification form. */ public function showCodeForm() { return view('auth.verify-code'); } /** * Verify the magic link token. */ public function verifyLink(Request $request) { if (!$request->hasValidSignature()) { return redirect()->route('login')->with('error', 'Invalid or expired magic link.'); } if ($this->authService->verifyMagicLink($request->query('token'))) { $request->session()->regenerate(); return redirect()->route('dashboard'); } return redirect()->route('login')->with('error', 'Invalid or expired magic link.'); } /** * Verify the magic code. */ public function verifyCode(Request $request) { $request->validate([ 'email' => 'required|email', 'code' => 'required|digits:6', ]); if ($this->authService->verifyCode($request->email, $request->code)) { $request->session()->regenerate(); return redirect()->route('dashboard'); } return back()->withErrors([ 'code' => 'Invalid or expired code.', ]); } /** * Log the user out. */ public function logout(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } }