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

问题描述 投票:0回答:1

我已经通过使用自定义身份验证创建了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 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'),如果一次密码错误,则应将其重定向到用户键入一次但有错误的同一页面。

php laravel
1个回答
0
投票

问题是以下陈述:

return redirect()->back();

这会将用户重定向到仅适用于POST请求但该语句使用GET请求重定向的路由。

尝试使用此:

return redirect()->route('login');

BTW:您不能将login => false作为Auth::routes()的参数传递。可能的参数是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.