$email]); $code = str_pad((string) random_int(0, 999999), self::CODE_LENGTH, '0', STR_PAD_LEFT); $user->otp_code = $code; $user->otp_expires_at = now()->addMinutes(self::EXPIRY_MINUTES); $user->save(); Mail::to($user->email)->send(new UserOtpMail($user->name ?? $user->email, $code)); return true; } public function validate(string $email, string $code) { $model = config('auth.providers.users.model'); $user = $model::where('email', $email)->first(); if (! $user) { return null; } if (! $user->otp_expires_at || $user->otp_code != $code || now()->isAfter($user->otp_expires_at)) { return null; } $user->otp_code = null; $user->otp_expires_at = null; $user->save(); return $user; } }