[英]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.