[Laravel 8 使用者認證] Jetstream 之 如何自定義登入驗證

24K大白羊發表於2020-12-11

那麼在 Jetstream 如何做自定義認證呢,需要增加 authenticateUsing 方法來自定義自己的登入邏輯。

  • App\Providers\JetstreamServiceProvider.php 的 boot 方法增加以下程式碼

    Fortify::authenticateUsing(function (Request $request) 
    {
    
      $user = User::where('email', $request->email)->first();
    
      if ($user &&
          Hash::check($request->password, $user->password)) {
              return $user;
          }
      });
    }

    如果該方法的返回值是:null 或者 false ,則代表登入失敗。

  • 在登入驗證時,Fortify 預設會用 email 作為使用者名稱來進行驗證,如果只要自定義這個欄位,不需要像上面那麼麻煩,只需要修改 config\fortify.php 檔案的 'username' => 'email', 為你想要的名字即可。
    例如前端使用了手機號進行驗證,那麼可以把 username 修改為 phone。

  • 我們在整合使用者認證功能時,不僅需要使用者名稱、密碼這兩個資訊進行登入驗證,還需要其他專案一同驗證,例如增加一個驗證碼。
    常用的驗證碼擴充套件包有很多,例如 mews/captcha 擴充套件包就可以無縫和 Laravel 進行整合,在登入驗證時額外增加對驗證碼的必填、正確性驗證即可。經過測試,直接在自定義方法中寫驗證是不可以的,例如下面的寫法:

    Fortify::authenticateUsing(function (Request $request) {
      // 對前端驗證碼進行必填、正確性驗證
      $request->validate([
          'validCode' => 'required|captcha'
      ]);
    
      $user = User::where('email', $request->email)->first();
    
      if ($user &&
          Hash::check($request->password, $user->password)) {
          return $user;
      }
    });

因為 Laravel\Fortify\Http\Controllers\AuthenticatedSessionController 的 store 方法使用了 Request 的方式對前端提交的資料進行了驗證,所以在此呼叫驗證方法,會重複驗證,導致驗證碼一直無法通過驗證。

該如何處理呢?容我在研究下。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章