【问题标题】:How to perform custom auth validation in Laravel如何在 Laravel 中执行自定义身份验证验证
【发布时间】:2020-04-24 17:41:07
【问题描述】:

我使用自定义身份验证创建了一个 laravel 应用程序。通过whych,用户可以单独使用手机号码登录。一旦他们输入手机号码并提交,他们将在手机上收到一次密码作为短信。在下一个屏幕上,他们应该输入一次性密码并登录。我已经成功实现了这个功能。

但我的问题是,当我验证一次密码时,如果密码正确,它会登录,如果密码错误,我会收到一条错误消息,指出 此路由不支持 GET 方法。支持的方法:POST。,我不知道是什么导致了这个错误,因为所有的路由都只在 POST 中。

请指导我实现这一点,如果一次性密码错误,页面应重定向到同一页面,说明错误显示“一次性密码不匹配”。

我的路线:

Auth::routes(['login' => false]);

Route::get('/home', 'HomeController@index')->name('home');

Route::post('/otp', 'AuthController@showOtpForm')->name('otp');

Route::post('/loginsuccess', 'AuthController@loginsuccess')->name('loginsuccess');

Login.blade.php上的form标签如下

<form class="login-form" action="{{ route('otp') }}" method="post">

otp.blade.php上登录页面的表单标签和隐藏值如下

<form class="login-form" method="POST" action="{{ route('loginsuccess') }}">

<input type="hidden" value="{{ $phone }}" name="phone">

而我的Auth Controller如下,

 public function showOtpForm(Request $request)
    {
        try
        {
            $newotp =  mt_rand(100000, 999999);

            $user = User::where('phone', $request->phone)->firstOrFail();
            $user->otp = $newotp;
            $user->save();

            return view('auth.otp')->with('phone', $request->phone);
        }
        catch(ModelNotFoundException $e)
        {
            //dd(get_class_methods($e)); // lists all available methods for exception object
            echo "No user found, please register or try again later.";
        }

    }


    public function loginsuccess(Request $request)
    {
        try
        {
            $user = User::where('phone', $request->phone)->firstOrFail();
                if($user->otp === $request->otp)
                {
                    Auth::login($user);
                    return redirect()->route('home');
                }else{
                    return redirect()->back();
                }
        }
        catch(ModelNotFoundException $e)
        {
            dd($e);
        }
    }

请帮助我验证,如果一次性密码正确意味着它应该去路由('home'),如果一次性密码错误,那么它应该被重定向到用户输入一次性密码但使用的同一页面错误。

【问题讨论】:

  • 登录表单在哪个页面?
  • 你在哪条路线上遇到了这个错误?
  • laravel 默认登录路由包含登录表单
  • 当我输入错误的一次性密码@BhargavChudasama 时,在 otp 路由上出现错误
  • 登录表单在/login?

标签: php laravel


【解决方案1】:

问题出在以下语句:

return redirect()->back();

这会将用户重定向回您的 otp 路由。您定义了该路由只能通过使用 POST 请求来访问。问题是重定向使用了GET 请求。

因此,您要么考虑将用户重定向到 login 路由,例如 return redirect()-&gt;route('login');,以便他必须再次输入他的手机号码(最终会更安全一点),要么您将 otp 路由从GETPOST 像这样:

Route::get('/otp', 'AuthController@showOtpForm')->name('otp');

如果您将POST 更改为GET,您还必须在登录视图中更改表单中的方法。


顺便说一句:您不能将login =&gt; false 作为Auth::routes() 的参数传递。可能的参数是:

Auth::routes([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

您需要覆盖登录路由并将其重定向到家或其他地方。

【讨论】:

  • 如果我使用return redirect()-&gt;route('login');,它可以工作,但我需要重定向到路由('otp'),错误提示一次性密码错误
  • 有问题。路由otp 仅用于发布请求。 loginotp 路由有什么区别?
  • login 包含手机号码输入字段,otp 包含一次性密码输入,当用户在登录页面按提交时,将在用户手机上收到该密码,
  • 它可以工作,但它会在搜索栏上显示所有信息,包括 csrf 令牌,有什么方法可以解决这个问题?
  • 如果您使用 GET 请求,所有信息都在 url 中。你无法改变这一点。我建议简单地将用户重定向回login 页面,让他们再次输入手机号码。其他类似的网站也有同样的逻辑。它比让用户直接输入新的 OTP 令牌更安全。
猜你喜欢
  • 2015-02-23
  • 2020-04-01
  • 2022-12-10
  • 2019-09-05
  • 2014-03-30
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多