簡體   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