我花了幾天時間對 Laravel 9 中某些密碼驗證失敗進行故障排除。密碼 testperson
解析為雜湊值 $2y$10$5xc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW
。對應資料庫表的直接查詢可確認這是正確的雜湊值。然而 Laravel 的身份驗證基礎設施拒絕此密碼並拒絕身份驗證。
這並不普遍。我有多個可以正確解析的密碼。例如,密碼 eo
解析為 $2y$10$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
,且 Laravel 會驗證該密碼。相同的機制會建立這兩個使用者記錄,儘管它們具有不同的權限(由記錄上的布林值指示)。
我找到了函數 password_verify
的錯誤,該函數被確定為在此 Stack Overflow 問題和此 Treehouse 線程中傳回漏報。
具體來說,這是 Laravel 中出現此故障點的堆疊:
login
路由透過控制器類別呼叫 \Illuminate\Foundation\Auth\AuthenticatesUsers::login
。 login
方法呼叫 \Illuminate\Foundation\Auth\AuthenticatesUsers::attemptLogin
。 attemptLogin
方法呼叫控制器守衛物件的 attempt
方法。 \Illuminate\Auth\SessionGuard::attempt
呼叫 \Illuminate\Auth\SessionGuard::hasValidCredentials
。 \Illuminate\Auth\SessionGuard::hasValidCredentials
呼叫守衛提供者物件上的 validateCredentials
方法。 Illuminate\Auth\EloquentUserProvider::validateCredentials
在其 hasher 物件上呼叫 check
方法。 Illuminate\Hashing\HashManager::check
在其驅動程式上呼叫 check
方法。 Illuminate\Hashing\BcryptHasher::check
呼叫 Illuminate\Hashing\AbstractHasher::check
。 Illuminate\Hashing\AbstractHasher::check
呼叫 password_verify
。 展開整個堆疊後,我在登入控制器的 login
方法中執行以下程式碼:
$provider = $this->guard()->getProvider(); $credentials = $this->credentials($request); $user = $provider->retrieveByCredentials($credentials); $password_unhashed = $request['password']; $password_hashed = $user->getAuthPassword(); $password_verify = password_verify($password_unhashed, $password_hashed); logger('attemping login', compact('password_verify','password_unhashed','password_hashed'));
轉儲此上下文:
{ "password_verify": false, "password_unhashed": "testperson", "password_hashed": "yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW" }
如果我將該密碼放入 SELECT users WHERE password=
查詢中,我就會得到我期望的用戶。
這是怎麼回事?我該如何解決這個問題?
我認為您關於您提供的雜湊值是“testperson”雜湊值的斷言實際上是錯誤的。由於雜湊是單向的,因此我無法告訴您所顯示的雜湊是從何而來的。注意:它在 PHP 7.4 上運行,但我認為它不會在 PHP 8 及更高版本上運行,因為 passwd_hash() 中的 salt 選項已被棄用。