2013-04-14 86 views
2

這似乎是一個非常簡單的,但我真的不明白。我想在Laravel 4中使用Auth::attempt($credentials),但是密碼已經被哈希(因爲它是一個API)。它在我發送未加密的密碼時起作用,但我不明白如何告訴Auth「不哈希」給定的密碼。使用Laravel身份驗證::嘗試與散列密碼

快速「演示」

什麼工作:

Auth::attempt([Request::getUser(), Request::getPassword()]); 

curl --user username:notHashedPassword localhost:8000/api/ 

什麼不起作用:

Auth::attempt([Request::getUser(), Request::getPassword()]); 

curl --user username:$2y$08$xo7HpxFyeF2UKHOYs/e localhost:8000/api/ 

是否有任何爭論,我可以傳遞給Auth::attempt()會告訴它使用它是因爲它而不是試圖重新它(如我認爲它)?

+0

掠過代碼:定義你自己的UserProviderInterface實現,或者如果你想使用你的內建db/eloquent提供者,註冊一個實現'HasherInterface'的非哈希類。 – Wrikken

回答

1

通過Laravel使用的散列方法產生不同的散列每個時間(即使是相同的字符串)的用戶。你可以在Hashing for Laravel瞭解更多。正如你可以讀到的,它不會對兩個字符串進行散列並對它們進行比較,而是使用未經哈希的字符串與散列進行比較。

如果你真的想這樣做,你需要實現你自己的Auth提供者和一個不同的哈希算法,它可以讓你比較哈希值。

如果您關心安全問題,則應考慮使用HTTPS,以便絕對不會以純文本形式發送安全細節(包括密碼)。

3

可以登錄手動

$user = User::find($id); 

if ($user->password == Request::getPassword()) { 
    Auth::login($user->id); 
} 
+1

不應該可以比較生成的散列,因爲它們每次都不相同。查看我的答案以獲得解釋爲什麼他們不同的鏈接。 –

2

你真的不應該在發送密碼之前散列密碼。在沒有鹽的情況下發送它之前,你如何能夠正確地對密碼進行散列?如果您在發送密碼之前有權訪問salt,那麼您爲什麼使用API​​?

如果您擔心傳遞未經哈希的密碼的安全性,那麼您應該使用SSL來確保安全傳輸數據。

不要認爲一個API與使用網頁有什麼不同 - 在網站上提交表單之前,您不需要使用密碼,而是需要您依賴https/SSL的安全級別。