繁体   English   中英

如何在 Laravel 中执行自定义身份验证

[英]How to perform custom auth validation in Laravel

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

但我的问题是,当我验证一次密码时,如果正确,则登录,如果错误,我会收到一条错误消息,指出此路由不支持 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 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">

我的身份验证控制器如下,

 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'),如果一次密码错误,那么它应该被重定向到用户输入一次密码但有错误的同一页面。

问题在于以下语句:

return redirect()->back();

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

因此,要么您考虑将用户重定向到login路由,例如return redirect()->route('login'); 这样他就必须再次输入他的手机号码(最终会更安全一点),或者您将otp路由从GET更改为POST如下所示:

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

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM